有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java assertEquals对于以不同方式创建的等效Jackson对象失败

所以我想知道为什么在我的单元测试(Junit 5)中,当两个对象的创建方式不同时,它们会失败

第一种方式:

static ObjectMapper mapper = new ObjectMapper();
JsonNode output = mapper.convertValue(jsonTransform, JsonNode.class);

第二种方式:

JsonNode expectedOutput = mapper.readTree(jsonString);

然后断言:

Assertions.assertEquals(expectedOutput, output);

失败:

is org.opentest4j.AssertionFailedError: expected: com.fasterxml.jackson.databind.node.ObjectNode@d6e7bab<jsonString> but was: com.fasterxml.jackson.databind.node.ObjectNode@5fa07e12<jsonString>

此外,如果我随后将断言编辑为:

Assertions.assertEquals(expectedOutput, mapper.readTree(output.toString()));

它会过去的。那么,是什么概念导致第一个断言失败呢


共 (2) 个答案

  1. # 1 楼答案

    assertEquals将调用此方法来查找两个对象是否相等:

     private static boolean isEquals(Object expected, Object actual) {
            return expected.equals(actual);
        }
    

    我想看看JsonNode中的equals()方法,看看正在检查什么

  2. # 2 楼答案

    我也有同样的问题,到目前为止,我找到的唯一解决方案是利用:

    Assertions.assertEquals(expectedOutput.toPrettyString(), output.toPrettyString());
    

    我知道这不是最理想的,但确实有效。有趣的是,InteliJ说比较失败时“内容相同”,但如果我删除toPrettyString(),测试就会失败