我有DTO课程
class MyDto {
private String f1;
private String f2;
private String f3;
// constructor
// get set equals/hashCode
}
它有
equal
/hascode
对,考虑了所有 3 个字段。
请看一下测试
...
var actualList = service.getActualList(...)
assertThat(actualList, containsInAnyOrder(new MyDto("a1","","c1"), new MyDto("a2","","c2")) )
...
它失败了,因为
f2
是在数据库端生成的(所以我无法预测该字段的值)。
我想通过自定义比较器来进行测试特定比较。在 Hamcrest 可以实现吗?
附注我不想重写 equals/hashcode 因为从我的业务逻辑角度来看它是不正确的
您可以通过忽略 AssertJ 库中的字段来使用比较。
var actualList = service.getActualList(...);
assertThat(actualList)
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("f2")
.containsExactlyInAnyOrder(
new MyDto("a1", "", "c1"),
new MyDto("a2", "", "c2")
);
或者,如果您仍然想使用 Hamcrest,则根据您的意愿创建自定义比较器,然后使用
assertTrue(myDto1.customCompareTo(myDto2));