如果断言失败,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- 中的给定断言捕获块。这是一个返回与上图相同的输出的示例:
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;
}
}