Hamcrest Matcher与junit样式的diff

5

我正在使用Hamcrest Matcher来比较两个JSON对象。比较方法使用的是Gson解析器。

这个匹配器非常好用,但当两个JSON不同的时候,我只能显示如下信息:

Expected: <[{"data":"data1","application":{"id":"1"}}]>
     but: <[{"data":"data1","application":{"id":"2"}}]>

这并不是很有帮助,我想展示哪些元素不匹配,类似于junit的assertEquals:

expected:<...a1","application":{"[filtered":false,"id":"1"]...> but was:<...a1","application":{"[id":"2"...>

有没有一种方法可以实现这个?
编辑:
@Override
protected void describeMismatchSafely(JsonElement item, 
                                      Description mismatchDescription) {
    //mismatchDescription.appendValue(item);
    assertEquals(item.toString(), originalJson.toString());
}

但这会给我带来:
expected:<...a1","application":{"[filtered":false,"id":"2"]...> 
but  was:<...a1","application":{"[id":"1","filtered":false],...>

注意只有"id:1"和"id:2"的差别,但JUnit在错误信息的JSON中显示了不同的排序顺序。
1个回答

2
到目前为止,我能做到的最好的是:
@Override
protected void describeMismatchSafely(JsonElement expectedJson, 
                                      Description mismatchDescription) {

  mismatchDescription.appendValue(expectedJson).appendText("\ndifference:\n");

  try {
     assertEquals(expectedJson.toString(), originalJson.toString());
  }
  catch (ComparisonFailure e) {
     String message = e.getMessage();
     message = message.replace("expected:", "");
     message = message.replace("but was:", "");
     message = message.replaceFirst(">", ">\n");
     mismatchDescription.appendText(message);
  }
}

这让我

Expected: <[{"data":"data1","application":{"id":"1"}}]>
     but: <[{"data":"data1","application":{"id":"2"}}]>
difference:
<...a1","application":{"[filtered":false,"id":"2"],...>
<...a1","application":{"[id":"1","filtered":false],...>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接