如何告诉 assertJsonEquals 在比较时忽略一个字段
how to tell assertJsonEquals to ignore one field in comparing
我正在使用 assertJsonEquals of JsonUnit
我在代码中执行以下操作:
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,然后它会抱怨它丢失了!
感谢您的帮助,谢谢。
您可以使用具有允许自定义的断言方法的库 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 的 link:http://jsonassert.skyscreamer.org/apidocs/org/skyscreamer/jsonassert/JSONAssert.html#assertEquals-java.lang.String-java.lang.String-org.skyscreamer.jsonassert.comparator.JSONComparator-
正如 documentation 所说:
assertJsonEquals(
"{\"root\":{\"test\":1, \"ignored\": 2}}",
"{\"root\":{\"test\":1, \"ignored\": 1}}",
whenIgnoringPaths("root.ignored")
);
要仅忽略一个字段,请将“@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);
我正在使用 assertJsonEquals of JsonUnit
我在代码中执行以下操作:
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,然后它会抱怨它丢失了!
感谢您的帮助,谢谢。
您可以使用具有允许自定义的断言方法的库 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 的 link:http://jsonassert.skyscreamer.org/apidocs/org/skyscreamer/jsonassert/JSONAssert.html#assertEquals-java.lang.String-java.lang.String-org.skyscreamer.jsonassert.comparator.JSONComparator-
正如 documentation 所说:
assertJsonEquals(
"{\"root\":{\"test\":1, \"ignored\": 2}}",
"{\"root\":{\"test\":1, \"ignored\": 1}}",
whenIgnoringPaths("root.ignored")
);
要仅忽略一个字段,请将“@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);