1. Обзор
Hamcrest — это библиотека, которая предоставляет методы, называемые сопоставителями, которые помогают разработчикам писать более простые модульные тесты. Сопоставителей предостаточно, вы можете начать, прочитав о некоторых из них здесь .
В этой статье мы рассмотрим сопоставители бобов.
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. Сопоставители фасоли
Сопоставители компонентов чрезвычайно полезны для проверки условий над POJO , что часто требуется при написании большинства модульных тестов.
Прежде чем начать, мы создадим класс, который поможет нам с примерами:
public class City {
String name;
String state;
// standard constructor, getters and setters
}
Теперь, когда у нас все готово, давайте посмотрим на сопоставители бобов в действии!
3.1. имеет свойство
Этот сопоставитель в основном проверяет, содержит ли определенный компонент определенное свойство, идентифицируемое по имени свойства :
@Test
public void givenACity_whenHasProperty_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city, hasProperty("state"));
}
Итак, этот тест будет пройден, потому что наш бин City
имеет свойство с именем state.
Следуя этой идее, мы также можем проверить, имеет ли bean-компонент определенное свойство и это свойство имеет определенное значение:
@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. жеПропертивалуесас
Иногда , когда нам нужно проверить множество свойств бина, может быть проще создать новый бин с нужными значениями . Затем мы можем проверить равенство между тестируемым компонентом и новым. Конечно, 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. получить дескриптор свойства
Есть сценарии, когда может пригодиться возможность исследовать структуру класса. 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")));
}
Дескриптор
объекта извлекает много информации о состоянии
свойства . В этом случае мы извлекли имя геттера и утверждаем, что оно равно некоторому ожидаемому значению. Обратите внимание, что мы также можем применять другие средства сопоставления текста.
Двигаясь дальше, последний метод, который мы рассмотрим, является более общим случаем той же самой идеи.
3.4. Дескрипторы свойстваFor
Этот метод делает то же самое, что и в предыдущем разделе, но для всех свойств 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
и остановились на уровне объекта
.
Затем мы просто использовали возможности Java 8 для фильтрации методов получения.
Наконец, мы использовали сопоставители коллекций, чтобы проверить что-то по списку геттеров .
Вы можете найти больше информации о сопоставлениях коллекций здесь .
4. Вывод
Сопоставители Hamcrest состоят из большого набора инструментов, которые можно использовать в каждом проекте. Их легко освоить, и они становятся чрезвычайно полезными за короткое время.
Сопоставители бинов, в частности, обеспечивают эффективный способ проверки POJO , что часто требуется при написании модульных тестов.
Чтобы получить полную реализацию этих примеров, обратитесь к проекту GitHub .