我正在开发一个测试框架,我想使用JsonUnit来比较两个 JSON。我的断言如下所示:
JsonAssert jsonAssert = assertThatJson("{\"a\":1, \"b\":2}")
.when(Option.IGNORING_ARRAY_ORDER)
.isEqualTo("{b:2, a:1}");
有没有办法从 JsonAssert 对象中提取布尔值和比较消息?
如果断言失败,该方法assertThatJson(...)
将抛出一个。AssertionError
在这种情况下,变量jsonAssert
没有分配值,您无法提取某些内容。
但是,您可以将断言包装在 try-catch 块中,并围绕它构建您想要的逻辑。因此,捕获AssertionError
然后提取消息。您可以在try-block内将布尔值设置为true(如果成功)或在catch-block内设置为false(如果失败)。
boolean success;
String message;
try {
assertThatJson("{\"a\":1, \"b\":2}")
.when(Option.IGNORING_ARRAY_ORDER)
.isEqualTo("{b:1, a:1}");
success = true;
message = "Assertion successful";
} catch (AssertionError e) {
success = false;
message = e.getMessage();
}
System.out.println(success);
System.out.println(message);
成功时输出:
true
Assertion successful
失败时输出:
false
JSON documents are different:
Different value found in node "b", expected: <1> but was: <2>.
如果你想让它可重用,一个选择是创建一个辅助方法 ( getAssertionResult
),它以自定义对象 ( Result
) 的形式返回结果,并采用 lambda 来评估 try-catch-block 内的给定断言。这是一个返回与上图相同的输出的示例:
public static void main(String[] args) {
final Result result = getAssertionResult(() -> {
assertThatJson("{\"a\":1, \"b\":2}")
.when(Option.IGNORING_ARRAY_ORDER)
.isEqualTo("{b:2, a:1}");
});
System.out.println(result.isSuccess());
System.out.println(result.getMessage());
}
public static Result getAssertionResult(final Runnable assertion) {
try {
assertion.run();
return new Result(true, "Assertion successful");
} catch (AssertionError e) {
return new Result(false, e.getMessage());
}
}
static class Result {
private final boolean success;
private final String message;
public Result(final boolean success, final String message) {
this.success = success;
this.message = message;
}
public boolean isSuccess() {
return success;
}
public String getMessage() {
return message;
}
}