Hamcrest Object Matchers

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.