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 .