isEqualToComparingFieldByField 失败但 isEqualToComparingFieldByFieldRecursively 通过

isEqualToComparingFieldByField is failing but isEqualToComparingFieldByFieldRecursively is passing

我正在写一个测试使用放心来测试一个API。我将预期的响应存储为字符串,我使用 google gson 将其转换为对象,然后使用 assertj 的 isEqualToComparingFieldByField 断言对象相等。

即使对象字段值相同,测试也是 failing.What 非常奇怪的是,当我递归调用 isEqualToComparingFieldByField 时,测试通过了吗?我可以使用 isEqualToComparingFieldByFieldRecursively 但对于我的下一个测试我需要使用 isEqualToIgnoringGivenFields.

这是我在调用 isEqualToComparingFieldByField 时遇到的异常。

Expecting values:
<[test.api.pojo.template.Template@42cc420b,
test.api.pojo.template.Status@6f2d3391]>
in fields:
<["template", "status"]>
but were:
<[test.api.pojo.template.Template@71b0289b,
test.api.pojo.template.Status@ae3c140]>
in test.api.pojo.template.TemplateResponse@2c9cafa5>.

这里是测试代码

RequestSpecification request = given()
            .spec(spec)
            .pathParam("name", "abc");

Response response = request.when().get(ENDPOINT_GET_TEMPLATE);

String expectedResponseStr =  "{ \"id\": 1247,"
    + "\"versionNumber\": 0,"
    + "\"template\": {";//...

String actualResponseStr = response.asString();
assertThat(actualResponseStr).isEqualTo(expectedResponseStr); //this passes 


TemplateResponse expectedResponseObj = convertToObj(expectedResponseStr, TemplateResponse.class);
TemplateResponse actualResponseObj = response.then().extract().as(TemplateResponse.class);

assertThat(actualResponseObj)
    .isEqualToComparingFieldByFieldRecursively(expectedResponseObj); //this passes

assertThat(actualResponseObj)
    .isEqualToComparingFieldByField(expectedResponseObj); //this fails with 

isEqualToComparingFieldByField 将使用我怀疑在 StatusTemplate 中未被覆盖的字段 equals 方法,这意味着要通过测试,它们必须是相同的引用(它们不是根据错误消息)。

另一方面,isEqualToComparingFieldByFieldRecursively 仅在覆盖时使用 equals 方法,否则它会逐个字段比较,测试通过实际 Status / Template 和预期的具有相同的字段值。