我正在使用rest-assured 编写一个测试来测试API。我将预期的响应存储为字符串,使用 google gson 将其转换为对象,然后使用assertj 的 isEqualToComparingFieldByField 来断言对象相等。
即使对象字段值相同,测试也会失败。非常奇怪的是,当我递归地调用 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
将使用字段 equals
方法,我怀疑该方法在 Status
和 Template
中没有被覆盖,这意味着为了通过测试,它们必须是相同的引用(它们不是根据错误消息)。
另一方面,isEqualToComparingFieldByFieldRecursively
仅在重写时使用 equals
方法,否则它会逐个字段进行比较,测试将通过实际的 Status
/模板
和预期的具有相同的字段值。
关于java - isEqualToComparingFieldByField 失败,但 isEqualToComparingFieldByFieldRecursively 正在通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49303735/