2013-08-01 13 views
5

kiedy mają wartość taką jakdomyślny typ używany przez jsonpath jayway?

x = 0.5771622052130299 

i chcę wykonać następujące czynności, za pomocą sprężyny 3.2 Resutlmatcher:

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

gdzie myPojo.getMyX zwraca podwójny test nie powiedzie się jako json jest konwertowany na BigDecimal z komunikatem o błędzie

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

Jak mogę tego uniknąć?

Odpowiedz

0

że ten sam problem, ale nie może zmienić typ Hamcrest używało do wartości JSON (BigDecimal).

Używany tego obejścia:

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

miałem ten sam problem z różnymi wartościami, gdzie niektóre były przetwarzane tak BigDecimal i niektórych jako double.

więc nie zdecydować się na stosowanie jsonPath zamiast konwertować odpowiedź do rzeczywistego obiektu z wykorzystaniem 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()); 
    } 

}