Подтвердить что ты не робот

Есть ли "Каждому" Matrix, который утверждает, что все элементы коллекции или Iterable соответствуют одному конкретному Matcher?

Учитывая Collection или Iterable элементов, существует ли Matcher (или комбинация сокетов), которые будут утверждать, что каждый элемент соответствует одному Matcher?

Например, данный тип элемента:

public interface Person {
    public String getGender();
}

Я хотел бы написать утверждение, что все элементы в коллекции Person имеют определенное значение gender. Я думаю примерно так:

Iterable<Person> people = ...;
assertThat(people, each(hasProperty("gender", "Male")));

Есть ли способ сделать это, не написав сам each?

4b9b3361

Ответ 1

Используйте Every.

import org.hamcrest.beans.HasPropertyWithValue;
import org.hamcrest.core.Every;
import org.hamcrest.core.Is;
import org.junit.Assert;

Assert.assertThat(people, (Every.everyItem(HasPropertyWithValue.hasProperty("gender", Is.is("male")))));

Hamcrest также обеспечивает Matchers#everyItem как ярлык для этого Matcher.


Полный пример

@org.junit.Test
public void method() throws Exception {
    Iterable<Person> people = Arrays.asList(new Person(), new Person());
    Assert.assertThat(people, (Every.everyItem(HasPropertyWithValue.hasProperty("gender", Is.is("male")))));
}

public static class Person {
    String gender = "male";

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

Ответ 2

ИМХО, это гораздо более читабельно

people.forEach(person -> Assert.assertThat(person.getGender()), Is.is("male"));