首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hamcrest matcher比较JSON的双值

Hamcrest matcher比较JSON的双值
EN

Stack Overflow用户
提问于 2015-12-05 15:51:01
回答 2查看 4.2K关注 0票数 10

我正在使用Hamcrest CoreMatcher类作为spring-test集成测试的一部分。我的JSON看起来像:

代码语言:javascript
复制
{"data":[{"distanceInMiles":4,"id":"f97236ba-f4ef-4...

我的集成测试看起来是:

代码语言:javascript
复制
double miles = 4.0
Activity a = new BasicActivity(miles);
this.activityManager.add(a); // A mock activity manager (in-memory)
...
this.mockMvc.perform(get("/").accept("application/json"))
    .andExpect(jsonPath("$.data[0].distanceInMiles", is(miles)))

然而,这个断言失败了:

代码语言:javascript
复制
java.lang.AssertionError: JSON path "$.data[0].distanceInMiles"
Expected: is <4.0>
     but: was <4>
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)

我知道这里有一个单独的IsCloseTo匹配器:http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/number/IsCloseTo.html,但使用它时如下所示:

代码语言:javascript
复制
.andExpect(jsonPath("$.data[0].distanceInMiles", closeTo(miles, 0)))

结果产生了一个奇怪的错误:

代码语言:javascript
复制
java.lang.AssertionError: JSON path "$.data[0].distanceInMiles"
Expected: a numeric value within <0.0> of <4.0>
     but: was a java.lang.Integer (<4>)
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)

我希望避免包含某种错误--我希望返回的值完全是4,我只是不在乎包含多少个尾随零。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-05 16:25:49

问题是匹配是在Integers上执行的,而不是在双值上执行的。

您正确地给出了一个Matcher<Double>。Spring使用Jayway对JSON进行解析,您的JSON路径将被计算为一个Integer对象。匹配将失败,因为IntegerDouble总是不相等的。

因此,您需要将Matcher更改为is((int) miles)

如果您不能控制所获得的JSON,而且distanceInMiles可能会更改,那么这就更有问题了。Jayway将将"4"解析为Integer,但它将将"4.0"解析为Double。在这种情况下,您必须实现自己的Matcher,它通过扩展TypeSafeMatcher来处理IntegerDouble对象。这将是一个简单的实现:

代码语言:javascript
复制
class NumberMatcher extends TypeSafeMatcher<Number> {

    private double value;

    public NumberMatcher(double value) {
        this.value = value;
    }

    @Override
    public void describeTo(Description description) {
        // some description
    }

    @Override
    protected boolean matchesSafely(Number item) {
        return item.doubleValue() == value;
    }

}

它通过将任何Number的双值与已知的双值进行比较来匹配它们。

票数 4
EN

Stack Overflow用户

发布于 2017-02-09 17:08:41

我发现默认情况下是比较浮点数,所以尝试如下:

代码语言:javascript
复制
.body("field_with_double_value",is(100.0f));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34107420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档