包含InAnyOrder hamcrest匹配器和自定义比较器

问题描述 投票:0回答:1

我有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 因为从我的业务逻辑角度来看它是不正确的

java list comparator hamcrest
1个回答
0
投票

您可以通过忽略 AssertJ 库中的字段来使用比较。

var actualList = service.getActualList(...);

assertThat(actualList)
    .usingRecursiveFieldByFieldElementComparatorIgnoringFields("f2")
    .containsExactlyInAnyOrder(
        new MyDto("a1", "", "c1"),
        new MyDto("a2", "", "c2")
    );

或者,如果您仍然想使用 Hamcrest,则根据您的意愿创建自定义比较器,然后使用

assertTrue(myDto1.customCompareTo(myDto2));
© www.soinside.com 2019 - 2024. All rights reserved.