Перейти к основному содержимому

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

· 3 мин. чтения

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. Сопоставители объектов

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

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

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

public class Location {}

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

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();
}
}

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

3.1. hasToString

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

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

assertThat(city, hasToString("[Name: San Francisco, State: CA]"));
}

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

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

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

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

@Test
public void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() {
City city = new City(null, null);

assertThat(city, hasToString(emptyOrNullString()));
}

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

3.2. типCompatibleWith

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

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

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

Это говорит о том, что Город — это Место, что верно, и этот тест должен пройти. Кроме того, если мы хотим проверить отрицательный случай:

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

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

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

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

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

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

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

4. Вывод

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

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

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