тип по умолчанию, используемый jayway jsonpath?

когда у меня есть значение, такое как

x = 0.5771622052130299

и я хочу сделать следующее, используя Spring 3.2 Resutlmatcher:

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

где myPojo.getMyX возвращает двойное значение, тест завершается неудачно, поскольку json преобразуется в BigDecimal с сообщением об ошибке

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

Как я могу этого избежать?


person NimChimpsky    schedule 01.08.2013    source источник


Ответы (4)


У меня была та же проблема, но я не мог изменить тип, который 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)));
person Niels    schedule 06.08.2015

У меня была такая же проблема с разными значениями, где некоторые из них были проанализированы как 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());
    }

}
person lotusdragon    schedule 10.03.2016

Используйте Hamcrest, чтобы создать собственный сопоставитель, который приводит к BigDecimal. Вот учебник:

Также может помочь код из несвязанного вопроса.

Ссылки

person Paul Sweatte    schedule 10.10.2013

Поскольку ожидается большое десятичное число... вы можете преобразовать двойное число в большое десятичное число

.andExpect(jsonPath("$.[1].myX", is(new BigDecimal(myPojo.getMyX()))))
person Ajay Reddy    schedule 28.02.2019