2013-08-01 32 views
5

khi tôi có một giá trị nhưloại mặc định được sử dụng bởi jayway jsonpath?

x = 0.5771622052130299 

và tôi muốn làm những điều sau đây, sử dụng lò xo 3.2 Resutlmatcher:

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

nơi myPojo.getMyX trả về một đôi, thử nghiệm thất bại như json được chuyển thành BigDecimal, với lỗi messaeg

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

Làm cách nào để tránh điều này?

Trả lời

0

tôi đã cùng một vấn đề nhưng tôi không thể thay đổi kiểu hamcrest được sử dụng cho các giá trị JSON (BigDecimal).

sử dụng Giải pháp này:

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

tôi đã cùng một vấn đề với các giá trị khác nhau, nơi một số đã được phân tích cú pháp như BigDecimal và một số như double.

Vì vậy, tôi quyết định không sử dụng jsonPath, thay vào đó tôi chuyển đổi đáp ứng với các đối tượng thực tế sử dụng 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()); 
    } 

}