【问题标题】:How to get assertion result from JsonUnit?如何从 JsonUnit 获取断言结果?
【发布时间】:2021-06-25 06:47:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: java json jsonunit


    【解决方案1】:

    如果断言失败,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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多