7

我正在使用JsonUnitassertJsonEquals

我在我的代码中执行以下操作:

assertJsonEquals(resource("ExpecedResponse.json"),
                         ActualResponse, when(IGNORING_ARRAY_ORDER));

ActualResponse有来自 HTTP POST 的响应。

ExpectedResponse.json是一个 json 文件,其中包含一些字段,例如:

{
  "columnNames": [
    "date",
    "signalType",
    "userId",
  ],
  "values": [
    [
      222555888,
      "OUT",
      "000-000-111-444"
    ],
    [
      333666999,
      "IN",
      "000-000-222-333"
    ],
  ],
  "lastUpdatedTimestamp": "2018-01-26T00:00:00Z"
}

我将这两个响应与 assertJsonEquals 进行比较。

我的问题是:我如何告诉它忽略检查lastUpdatedTimestamp字段,但使用 assertJsonEquals 或您可以推荐的任何其他库检查其他所有内容?!

如果我从 ExpectedResponse.json 中删除 lastUpdatedTimestamp,那么它会抱怨它丢失了!

非常感谢您的帮助,谢谢。

4

3 回答 3

7

您可以使用库https://github.com/skyscreamer/JSONassert,它有一个允许自定义的断言方法。

这是一个正在通过的测试示例(并且忽略了该time字段的值)

  @Test
  public void test() throws JSONException {
    JSONAssert.assertEquals("{x: 1, time:123}",
                            "{x: 1, time:234}",
                            new CustomComparator(
                              JSONCompareMode.STRICT,
                              Customization.customization("time", // json path you want to customize
                                                          new ValueMatcher() {
                                @Override public boolean equal(Object o1, Object o2) {
                                  return true; // in your case just ignore the values and return true
                                }
                              }))
    );
  }

这是我在示例中使用的 assertEquals 方法的 javadoc 的链接:http: //jsonassert.skyscreamer.org/apidocs/org/skyscreamer/jsonassert/JSONAssert.html#assertEquals-java.lang.String-java。 lang.String-org.skyscreamer.jsonassert.comparator.JSONComparator-

于 2018-05-04T11:48:31.260 回答
2

正如文档所说:

assertJsonEquals(
   "{\"root\":{\"test\":1, \"ignored\": 2}}", 
   "{\"root\":{\"test\":1, \"ignored\": 1}}", 
   whenIgnoringPaths("root.ignored")
);
于 2018-06-02T08:13:47.477 回答
0

要仅忽略一个字段,请将“@IGNORE”添加到预期的 json 中,然后设置 setIgnorePlaceholder 如下

JsonAssert.setTolerance(0.0000001);
JsonAssert.setOptions(IGNORING_ARRAY_ORDER);
JsonAssert.setIgnorePlaceholder("@IGNORE"); //You have to tag the ignored values in ExpecedResponse.json with "@IGNORE"

assertJsonEquals(resource("ExpecedResponse.json"),
                         ActualResponse);
于 2020-05-17T11:54:12.223 回答