2013-08-01 8 views
5

quando ho un valore cometipo predefinito utilizzato da jayway jsonpath?

x = 0.5771622052130299 

e voglio fare quanto segue, utilizzando la primavera 3.2 Resutlmatcher:

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

dove myPojo.getMyX restituisce un double, il test fallisce come JSON viene convertito in un BigDecimal, con l'errore messaggioeg

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

Come posso evitare questo?

risposta

0

Ho avuto lo stesso problema, ma non ho potuto cambiare il tipo di Hamcrest stava usando per il valore JSON (BigDecimal).

usate questa soluzione:

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

Ho avuto lo stesso problema con valori diversi in cui alcuni sono stati analizzati come BigDecimal e alcuni come double.

così ho scelto di non usare jsonPath, invece converto la risposta all'oggetto reale utilizzando 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()); 
    } 

}