I have a DTO class
class MyDto {
private String f1;
private String f2;
private String f3;
// constructor
// get set equals/hashCode
}
It has equal
/hascode
pair which takes into account all 3 fields.
Please take a look on test
...
var actualList = service.getActualList(...)
assertThat(actualList, containsInAnyOrder(new MyDto("a1","","c1"), new MyDto("a2","","c2")) )
...
It fails because f2
is generated on database side(so I can't predict value for that field).
I want to pass custom comparator to make test specific comparison. Is it possible to achieve it in Hamcrest ?
P.S. I don't want to rewrite equals/hashcode beause it will not be correct from my business logic standpoint
You can use containsInAnyOrder(Matcher...)
and pass a vararg list of Matcher
instances instead of a list of MyDto
. You may be able to find a suitable Matcher
from the Hamcrest library, such as perhaps HasPropertyWithValue
or something similar. Otherwise, write your own class implementing Matcher
:
class MyMatcher implements Matcher<MyDto> {
private final MyDto expected;
public MyMatcher(MyDto expected) { this.actual = expected; }
@Override
public boolean matches(MyDto actual) {
return actual.abc = expected.abc && actual.xyz = expected.xyz;
}
}
...
assertThat(actualList, containsInAnyOrder(MyMatcher(new MyDto(...)),...));