Hamcrest Object Matchers
1. обзор
Hamcrest provides matchers for making unit test assertions simpler and more legible. Вы можете приступить к изучению некоторых доступных сопоставителейhere.
В этом кратком руководстве мы углубимся в сопоставление объектов.
2. Настроить
Чтобы получить Hamcrest, нам просто нужноadd the following Maven dependency to our pom.xml:
org.hamcrest
java-hamcrest
2.0.0.0
test
Последнюю версию Hamcrest можно найти наMaven Central.
3. Сопоставители объектов
Object matchers are meant to perform checks over object’s properties.
Прежде чем переходить к сопоставителям, мы создадим несколько 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 method verifies that certain object has a toString method that returns a specific String:
@Test
public void givenACity_whenHasToString_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city, hasToString("[Name: San Francisco, State: CA]"));
}
Итак, мы создаемCity и проверяем, что его методtoString возвращает желаемыйString. Мы можем сделать еще один шаг вперед и вместо проверки на равенство проверить на наличие другого условия:
@Test
public void givenACity_whenHasToStringEqualToIgnoringCase_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city, hasToString(
equalToIgnoringCase("[NAME: SAN FRANCISCO, STATE: CA]")));
}
Как видим,hasToString is overloaded and can receive both a String or a text matcher as a parameter. Итак, мы также можем сделать такие вещи, как:
@Test
public void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() {
City city = new City(null, null);
assertThat(city, hasToString(emptyOrNullString()));
}
Вы можете найти дополнительную информацию о сопоставителях текстаhere. Теперь перейдем к следующему сопоставителю объектов.
3.2. typeCompatibleWithс
Этот сопоставительrepresents an is-a relationship. Здесь вступает в игру наш суперклассLocation:
@Test
public void givenACity_whenTypeCompatibleWithLocation_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(typeCompatibleWith(Location.class)));
}
Это означает, чтоCity - этоLocation,, что верно, и этот тест должен пройти. Кроме того, если мы хотим проверить отрицательный случай:
@Test
public void givenACity_whenTypeNotCompatibleWithString_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(not(typeCompatibleWith(String.class))));
}
Конечно, наш классCity неString.
Наконец, обратите внимание, что все объекты Java должны пройти следующий тест:
@Test
public void givenACity_whenTypeCompatibleWithObject_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(typeCompatibleWith(Object.class)));
}
Помните, чтоthe matcher is consists of a wrapper over another matcher with the purpose of making the whole assertion more readable.
4. Заключение
Hamcrest provides a simple and clean way of creating assertions. Существует множество сопоставлений, которые упрощают жизнь каждого разработчика, а также делают каждый проект более читабельным.
А сопоставители объектов - это, безусловно, простой способ проверки свойств класса.
Как всегда, вы найдете полную реализацию наthe GitHub project.