Спаренные бобы Hamcrest

1. Обзор

  • Hamcrest - это библиотека, которая предоставляет методы, называемые matchers, для помощи разработчикам в написании более простых модульных тестов. ** Существует множество matchers, вы можете начать, прочитав о некоторых из них ссылка:/java-junit-hamcrest-guide[здесь],

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

2. Настроить

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

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

Последняя версия Hamcrest может быть найдена на Maven Central .

3. Bean Matchers

Сравнители бинов чрезвычайно полезны для проверки условий в POJO , что часто требуется при написании большинства модульных тестов.

Прежде чем начать, мы создадим класс, который поможет нам в примерах:

public class City {
    String name;
    String state;

   //standard constructor, getters and setters

}

Теперь, когда все готово, давайте посмотрим, как работают бобы в действии!

3.1. hasProperty

Этот подход в основном предназначен для проверки, содержит ли определенный бин конкретное свойство, идентифицированное по имени свойства _: _

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

    assertThat(city, hasProperty("state"));
}

Итак, этот тест пройдет, потому что у нашего bean-компонента City есть свойство с именем state.

Следуя этой идее, мы также можем проверить, имеет ли боб определенное свойство и это свойство имеет определенное значение:

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

    assertThat(city, hasProperty("name", equalTo("San Francisco")));
}

Как мы видим, hasProperty перегружен и может использоваться со вторым сопоставителем для проверки определенного условия над свойством.

Итак, мы также можем сделать это:

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

    assertThat(city, hasProperty("state", equalToIgnoringCase("ca")));
}

Полезно, правда? Мы можем продвинуть эту идею еще на один шаг вперед с помощью сопоставителя, который мы рассмотрим дальше.

3.2. samePropertyValuesAs

Иногда когда нам приходится проверять множество свойств компонента, может быть проще создать новый компонент с требуемыми значениями . Затем мы можем проверить равенство между протестированным компонентом и новым. Конечно, Hamcrest предоставляет подходящее решение для этой ситуации:

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

    assertThat(city, samePropertyValuesAs(city2));
}

Это приводит к меньшему количеству утверждений и упрощению кода. Таким же образом, мы можем проверить отрицательный случай:

@Test
public void givenACity__whenNotSamePropertyValuesAs__thenCorrect() {
    City city = new City("San Francisco", "CA");
    City city2 = new City("Los Angeles", "CA");

    assertThat(city, not(samePropertyValuesAs(city2)));
}

Далее, давайте посмотрим пару утилит для проверки свойств класса.

3.3. getPropertyDescriptor

  • Существуют сценарии, когда может пригодиться возможность исследовать структуру классов. ** Hamcrest предоставляет несколько утилитарных методов для этого:

@Test
public void givenACity__whenGetPropertyDescriptor__thenCorrect() {
    City city = new City("San Francisco", "CA");
    PropertyDescriptor descriptor = getPropertyDescriptor("state", city);

    assertThat(descriptor
      .getReadMethod()
      .getName(), is(equalTo("getState")));
}
  • Объект descriptor получает много информации о свойстве state . ** В этом случае мы извлекли имя получателя и утверждали, что оно равно некоторому ожидаемому значению. Обратите внимание, что мы также можем применять другие сопоставители текста.

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

3.4. propertyDescriptorsFor

Этот метод в основном такой же, как и в предыдущем разделе, но для всех свойств bean . Нам также нужно указать, насколько высоко мы хотим подняться в иерархии классов:

@Test
public void givenACity__whenGetPropertyDescriptorsFor__thenCorrect() {
    City city = new City("San Francisco", "CA");
    PropertyDescriptor[]descriptors = propertyDescriptorsFor(
      city, Object.class);

    List<String> getters = Arrays.stream(descriptors)
      .map(x -> x.getReadMethod().getName())
      .collect(toList());

    assertThat(getters, containsInAnyOrder("getName", "getState"));
}

Итак, что мы сделали здесь: получили все дескрипторы свойств из bean-компонента city и остановились на уровне Object .

Затем мы просто использовали возможности Java 8 для фильтрации методов получения.

Наконец, мы использовали подборщики совпадений для проверки чего-либо в списке getters . Вы можете найти более подробную информацию о коллекциях соответствия по ссылке:/hamcrest-collection-arrays[здесь].

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

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

  • В частности, средства сравнения бинов предоставляют эффективный способ создания утверждений с помощью POJO ** , что часто требуется при написании модульных тестов.

Чтобы получить полную реализацию этих примеров, пожалуйста, обратитесь к the проект GitHub .