2013-08-01 19 views
5

wenn ich einen Wert haben wieStandardtyp von jayway jsonpath verwendet?

x = 0.5771622052130299 

und ich möchte folgendes tun, mit Feder 3.2 Resutlmatcher:

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

wo myPojo.getMyX ein Doppelzurückgibt, schlägt der Test als json wird in ein BigDecimal konvertiert, mit dem Fehler messag

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

Wie kann ich dies vermeiden?

Antwort

0

Ich hatte das gleiche Problem, aber ich konnte die Art nicht ändern hamcrest für den JSON-Wert wurde unter Verwendung von (BigDecimal).

diese Behelfslösung verwendet:

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

Ich hatte das gleiche Problem mit unterschiedlichen Werten, bei denen einige als BigDecimal und einige als double analysiert wurden.

So wähle ich nicht jsonPath zu benutzen und nicht ich die Antwort auf das eigentliche Objekt konvertieren MappingJackson2HttpMessageConverter mit:

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

} 
Verwandte Themen