Możesz użyć innego wbudowanego Hamcrest do tego, FeatureMatcher. Są one zaprojektowane tak, aby można je było łączyć z innymi elementami dopasowującymi po przekształceniu danych wejściowych w coś innego. Więc w twoim przypadku byłoby zrobić coś takiego:
@Test
public void test1() {
List<Person> names = new ArrayList<>();
names.add(new Person("Bob"));
names.add(new Person("i"));
assertThat(names, hasItem(name(equalTo("Winkleburger"))));
}
private FeatureMatcher<Person, String> name(Matcher<String> matcher) {
return new FeatureMatcher<Person, String>(matcher, "name", "name") {
@Override
protected String featureValueOf(Person actual) {
return actual.name();
}
};
}
Korzyść dostaniesz z tego ponad niestandardowym dopasowującego jest to, że w pełni wielokrotnego użytku i composable z innymi dopasowujących jak wszystko co robi to dane ekstrakcja następnie odradza się do dowolnego innego, jakiego chcesz. Otrzymasz także odpowiednią diagnostykę, np. w powyższym przykładzie, jeśli zmienisz assert na wartość, która nie jest obecna, otrzymasz:
java.lang.AssertionError:
Expected: a collection containing name "Batman"
but: name was "Bob", name was "Winkleburger"
, więc chcesz wywołać metodę name() we wszystkich elementach kolekcji? –