3

我正在开发一个测试框架,我想使用JsonUnit来比较两个 JSON。我的断言如下所示:

JsonAssert jsonAssert = assertThatJson("{\"a\":1, \"b\":2}")
        .when(Option.IGNORING_ARRAY_ORDER)
        .isEqualTo("{b:2, a:1}");

有没有办法从 JsonAssert 对象中提取布尔值和比较消息?

4

1 回答 1

2

如果断言失败,该方法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;
    }
}
于 2021-07-01T09:59:36.567 回答