加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Hamcrest matcher比较JSON的double值

发布时间:2020-12-15 00:41:05 所属栏目:Java 来源:网络整理
导读:我正在使用Hamcrest CoreMatcher类作为弹簧测试集成测试的一部分.我的 JSON看起来像: {"data":[{"distanceInMiles":4,"id":"f97236ba-f4ef-4... 我的集成测试看起来像: double miles = 4.0Activity a = new BasicActivity(miles);this.activityManager.add
我正在使用Hamcrest CoreMatcher类作为弹簧测试集成测试的一部分.我的 JSON看起来像:
{"data":[{"distanceInMiles":4,"id":"f97236ba-f4ef-4...

我的集成测试看起来像:

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

但是,断言失败了:

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,但是像这样使用它:

.andExpect(jsonPath("$.data[0].distanceInMiles",closeTo(miles,0)))

导致一个奇怪的错误:

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,我只是不在乎包含多少尾随零.

解决方法

问题是匹配是在整数上执行而不是在双值上执行.

您正确地给出了Matcher< Double>. Spring使用Jayway来解析JSON,你的JSON路径将被评估为Integer对象.匹配将失败,因为Integer和Double总是不相等.

因此,您需要将匹配器更改为((int)英里).

如果你不控制你正在获得的JSON并且distanceInMiles可能会改变,那么这就更有问题了. Jayway将解析“4”作为整数但它将解析“4.0”作为双精度.在这种情况下,您将必须通过扩展TypeSafeMatcher来实现自己的Matcher来处理Integer和Double对象.这将是一个简单的实现:

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

}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读