5

当我有一个值时

x = 0.5771622052130299

我想使用 spring 3.2 Resutlmatcher 执行以下操作:

.andExpect(jsonPath("$.[1].myX").value(myPojo.getMyX()))

其中 myPojo.getMyX 返回一个 double,测试失败,因为 json 被转换为 BigDecimal,错误消息

java.lang.AssertionError: 
For JSON path $.[1].myX type of value expected:
<class java.lang.Double> but was:<class java.math.BigDecimal>

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

4

4 回答 4

0

使用 Hamcrest 创建一个转换为 BigDecimal 的自定义匹配器。这是一个教程:

来自不相关问题的代码也可能有所帮助。

参考

于 2013-10-10T20:41:49.033 回答
0

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

使用此解决方法:

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);
}

...

.andExpect(jsonPath("$.values.temperature").value(closeTo(-13.26517)));
于 2015-08-06T07:38:43.343 回答
0

因为它期待一个大十进制......你可以将双精度转换为大十进制

.andExpect(jsonPath("$.[1].myX", is(new BigDecimal(myPojo.getMyX()))))
于 2019-02-28T20:51:53.810 回答
0

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

所以我选择不使用 jsonPath,而是使用以下命令将响应转换为实际对象MappingJackson2HttpMessageConverter

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());
    }

}
于 2016-03-10T13:49:50.727 回答