1. Обзор

Hamcrest предоставляет средства сопоставления для упрощения и разборчивости утверждений модульных тестов. Вы можете начать изучать некоторые из доступных сопоставителей здесь.

В этом кратком руководстве мы углубимся в сопоставление объектов.

2. Настройка

Чтобы получить Hamcrest, нам просто нужно добавить следующую зависимость Maven в наш pom.xml:

Последнюю версию Hamcrest можно найти на Maven Central.

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>java-hamcrest</artifactId>
    <version>2.0.0.0</version>
    <scope>test</scope>
</dependency>

3. Сопоставители объектов

Сопоставители объектов предназначены для проверки свойств объекта.

Прежде чем приступить к поиску сопоставителей, мы создадим пару bean-компонентов, чтобы сделать примеры простыми для понимания.

Наш первый объект называется Location и не имеет свойств:

Мы назовем наш второй компонент City и добавим к нему следующую реализацию:

public class Location {}

Обратите внимание, что City расширяет Location. Мы воспользуемся этим позже. Теперь давайте начнем с сопоставления объектов!

public class City extends Location {
    
    String name;
    String state;

    // standard constructor, getters and setters

    @Override
    public String toString() {
        if (this.name == null && this.state == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        sb.append("Name: ");
        sb.append(this.name);
        sb.append(", ");
        sb.append("State: ");
        sb.append(this.state);
        sb.append("]");
        return sb.toString();
    }
}

3.1. hasToString

Как следует из названия, метод hasToString проверяет, что у определенного объекта есть метод toString, который возвращает определенную строку:

Итак, мы создаем City и проверяем, что его метод toString возвращает строку, которая мы хотим. Мы можем сделать еще один шаг и вместо проверки на равенство проверить какое-либо другое условие:

@Test
public void givenACity_whenHasToString_thenCorrect() {
    City city = new City("San Francisco", "CA");
    
    assertThat(city, hasToString("[Name: San Francisco, State: CA]"));
}

Как мы видим, hasToString перегружен и может принимать как String, так и текстовое сопоставление в качестве параметра. Итак, мы также можем делать такие вещи, как:

@Test
public void givenACity_whenHasToStringEqualToIgnoringCase_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city, hasToString(
      equalToIgnoringCase("[NAME: SAN FRANCISCO, STATE: CA]")));
}

Вы можете найти больше информации о текстовых сопоставлениях здесь. Теперь давайте перейдем к следующему сопоставителю объектов.

@Test
public void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() {
    City city = new City(null, null);
    
    assertThat(city, hasToString(emptyOrNullString()));
}

3.2. typeCompatibleWith

Этот сопоставитель представляет собой отношение. Здесь вступает в игру наш суперкласс Location:

Это говорит о том, что City is-a Location, что верно, и этот тест должен пройти. Кроме того, если мы хотим проверить отрицательный случай:

@Test
public void givenACity_whenTypeCompatibleWithLocation_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city.getClass(), is(typeCompatibleWith(Location.class)));
}

Конечно, наш класс City не является строкой.

@Test
public void givenACity_whenTypeNotCompatibleWithString_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city.getClass(), is(not(typeCompatibleWith(String.class))));
}

Наконец, обратите внимание, что все объекты Java должны пройти следующий тест:

Пожалуйста, помните, что сопоставитель состоит из оболочки над другим сопоставителем с целью сделать все утверждение более читаемым.

@Test
public void givenACity_whenTypeCompatibleWithObject_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city.getClass(), is(typeCompatibleWith(Object.class)));
}

4. Заключение

Hamcrest предоставляет простой и понятный способ создания утверждений. Существует большое разнообразие сопоставителей, которые делают жизнь каждого разработчика проще, а каждый проект — более читабельным.

И сопоставители объектов, безусловно, являются простым способом проверки свойств класса.

Как всегда, полную реализацию вы найдете в проекте GitHub.

«