5

Hamcrest Matcher を使用して 2 つの JSON オブジェクトを比較しています。比較メソッドは Gson パーサーを使用します。

マッチャーはうまく機能しますが、2 つの 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 の順序が異なることも示しています。

4

1 に答える 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],...>
于 2013-01-05T05:56:32.380 に答える