Ответ 1
Для этого вы можете использовать другой встроенный Hamcrest, FeatureMatcher. Они предназначены для объединения с другими помощниками после того, как они преобразуют ваш вклад в нечто другое. Поэтому в вашем случае вы сделаете что-то вроде этого:
@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();
}
};
}
Преимущество, которое вы получите с помощью этого пользовательского совпадения, состоит в том, что он полностью повторно используется и может быть скомпонован с другими помощниками, поскольку все, что он делает, - это извлечение данных, а затем отбрасывает любой другой подходящий помощник. Вы также получите соответствующую диагностику, например. в приведенном выше примере вы будете, если вы измените утверждение на значение, которое вы не получите:
java.lang.AssertionError:
Expected: a collection containing name "Batman"
but: name was "Bob", name was "Winkleburger"