java - 如何从 JsonUnit 获取断言结果?

标签 java json jsonunit

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

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

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

最佳答案

如果断言失败,方法 assertThatJson(...) 会抛出一个 AssertionError。在这种情况下,变量 jsonAssert 没有赋值,您无法提取某些内容。

但是,您可以将您的断言包装在一个 try-catch block 中,并围绕它构建您想要的逻辑。因此,捕获 AssertionError 然后提取消息。您可以在 try-block 中将 boolean 值设置为 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;
    }
}

关于java - 如何从 JsonUnit 获取断言结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68126617/

相关文章:

java - 从 Elasticsearch 的 JSON 响应形成自定义 JSON 对象

ios - SBJson iOS 解析器方法已弃用?

javascript - 在更改时从表单生成 JSON 字符串以填充营业时间

Java JSON 单元测试通过但值错误

java - 从 ArrayList 中删除对象后出现 ArrayList IndexOutOBoundsException

java - 编译运行时是否需要指定间接导入的包?

java - 需要敌人管理器在生成敌人之间等待

java - 流畅的动画 - 每帧必须有一个持续时间