首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jayway jsonpath使用的默认类型?

jayway jsonpath使用的默认类型?
EN

Stack Overflow用户
提问于 2013-08-01 22:03:32
回答 4查看 3.7K关注 0票数 5

当我有一个值,比如

代码语言:javascript
复制
x = 0.5771622052130299

我想用Spring3.2Resutlmatcher做以下事情:

代码语言:javascript
复制
.andExpect(jsonPath("$.[1].myX").value(myPojo.getMyX()))

在myPojo.getMyX返回双精度值的情况下,测试失败,因为json被转换为BigDecimal,并显示错误消息,例如

代码语言:javascript
复制
java.lang.AssertionError: 
For JSON path $.[1].myX type of value expected:
<class java.lang.Double> but was:<class java.math.BigDecimal>

我怎样才能避免这种情况?

EN

回答 4

Stack Overflow用户

发布于 2013-10-11 04:41:49

使用Hamcrest创建自定义匹配器,该匹配器强制转换为BigDecimal。以下是一个教程:

  • Writing Custom Matchers

来自unrelated question的代码也可能会有所帮助。

参考

票数 0
EN

Stack Overflow用户

发布于 2015-08-06 15:38:43

我也有同样的问题,但我无法更改Hamcrest用于JSON值的类型(BigDecimal)。

已使用此解决方法:

代码语言:javascript
复制
public static final double DEFAULT_PRECISION = 0.000001;

public static Matcher<BigDecimal> closeTo(double value, double precision) {
    return BigDecimalCloseTo.closeTo(new BigDecimal(value), new BigDecimal(precision));
}

public static Matcher<BigDecimal> closeTo(double value) {
    return closeTo(value, DEFAULT_PRECISION);
}

..。

代码语言:javascript
复制
.andExpect(jsonPath("$.values.temperature").value(closeTo(-13.26517)));
票数 0
EN

Stack Overflow用户

发布于 2016-03-10 21:49:51

对于不同的值,我也遇到了同样的问题,其中一些值被解析为BigDecimal,另一些值被解析为double

因此,我选择不使用jsonPath,而是使用MappingJackson2HttpMessageConverter将响应转换为实际的对象

代码语言:javascript
复制
public class ControllerTest {

    @Autowired
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

    @SuppressWarnings("unchecked")
    protected <T> T toObject(MockHttpServletResponse response, Class<T> clazz) throws IOException{
        MockClientHttpResponse inputMessage = new MockClientHttpResponse(response.getContentAsByteArray(), 
                HttpStatus.valueOf(response.getStatus()));
        return (T) mappingJackson2HttpMessageConverter.read(clazz, inputMessage);
    }

    @Test
    public test(){
        MvcResult result = mockMvc.perform(get("/rest/url")...)
            .andExpect(status().isOk())
            .andExpect(content().contentType(APPLICATION_JSON_UTF8))
            .andReturn();

        MyPojoClass pojo = toObject(result.getResponse(), MyPojoClass.class);
        assertArrayEquals(new double[]{0.1, 0.2, 0.3}, pojo.getDoubleArray());
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17996274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档