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.
«