Sie können einen anderen Hamcrest-Built-In dafür verwenden, einen FeatureMatcher. Diese sind so konzipiert, dass sie mit anderen Matchern kombiniert werden können, nachdem sie Ihre Eingabe in etwas anderes verwandelt haben. Also in Ihrem Fall, dass Sie so etwas tun würde:
@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();
}
};
}
Der Nutzen Sie mit diesem über einen benutzerdefinierten Matcher zu bekommen ist, dass es mit anderen Matcher wie alle tut es vollständig wiederverwendbar und zusammensetzbare ist, ist die Datenextraktion dann sich auf jeden anderen Matcher verlagern, den Sie wollen. Sie werden auch eine geeignete Diagnose erhalten, z.B. Im obigen Beispiel werden Sie, wenn Sie die Assertion auf einen Wert ändern, nicht die gegenwärtige erhalten Sie:
java.lang.AssertionError:
Expected: a collection containing name "Batman"
but: name was "Bob", name was "Winkleburger"
so, möchten Sie den Namen() -Methode auf alle Artikel einer Kollektion nennen? –