hamcrest - makstron/info GitHub Wiki

Hamcrest is the well-known framework used for unit testing in the Java ecosystem. It's bundled in JUnit and simply put, it uses existing predicates – called matcher classes – for making assertions.

Hamcrest is commonly used with junit and other testing frameworks for making assertions. Specifically, instead of using junit‘s numerous assert methods, we only use the API's single assertThat statement with appropriate matches.

Implementation

Gradle

dependencies {
  testImplementation "org.hamcrest:hamcrest:2.2"
}

assertThat

Более читаемая форма.
Принимает значение actual и прогоняет его через Matcher, чтобы убедиться, что это значение удовлетворяет условиям, заданным в мэтчере.

import static org.hamcrest.CoreMatchers.*;

Object мэтчеры

Мэтчеры для работы с объектами

  • equalTo

Сравнивает, что два объекта равны (equals)

assertThat(s1, equalTo(s2));
  • assertEquals

assertEquals(s1,s2);
  • instanceOf

Выполняет проверку, что объект является инстанцией указанного класса.

assertThat(s1, instanceOf(String.class));
  • nullValue

Проверка на null

assertThat(s1, nullValue());
  • is

Мэтчер is, это так называемый “синтаксический сахар”. Не несет никакого смысла, предназначен только для повышения читабельности теста.

assertThat(a, equalTo(b)); 
assertThat(a, is(equalTo(b))); 
  • notNullValue

Проверка на не null

assertThat(s1, notNullValue());
  • sameInstance

Проверка, что значения являются одним и тем же объектом

String s1 = new String("1");
String s2 = new String("1");
assertThat(s1, sameInstance(s2));

Text мэтчеры

Мэтчеры для работы со строками

  • startsWith

Проверяет, что строка начинается с указанной строки

String s = "abcdefg";
assertThat(s, startsWith("abc"));
  • endsWith

Проверяет, что строка заканчивается указанной строкой

String s = "abcdefg";
assertThat(s, endsWith("def"));
  • containsString

Проверяет, что строка содержит указанную строку

String s = "abcdefg";
assertThat(s, containsString("def"));

Collections

Мэтчеры для работы с коллекциями

  • hasItem

Проверяет, что коллекция содержит указанный элемент

List<String> list = Arrays.asList("one", "two", "three", "four", "five");
assertThat(list, hasItem("two"));

Мэтчер hasItem также можно использовать в комбинации с другим мэтчером. Например, добавим startsWith, чтобы узнать, содержит ли коллекция элементы, начинающиеся с буквы t.

List<String> list = Arrays.asList("one", "two", "three", "four", "five");
assertThat(list, hasItem(startsWith("t"), endsWith("r"))); //сработает или startsWith или endsWith
  • hasItems

Проверяет, что коллекция содержит указанные элементы

List<String> list = Arrays.asList("one", "two", "three", "four", "five");
assertThat(list, hasItems("five", "six"));
  • everyItem

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

List<String> list = Arrays.asList("one", "two", "three", "four", "five");
assertThat(list, everyItem(startsWith("t")));
  • assertIterableEquals

Assert that expected and actual iterables are deeply equal

assertIterableEquals(savedNicknames, listSavedNicknames)
  • empty

  • hasSize

  • arrayWithSize

  • containsInAnyOrder

Logical

Мэтчеры, позволяющие создавать логические блоки (И, ИЛИ, НЕ) из нескольких мэтчеров.

  • allOf

Позволяет объединить несколько мэтчеров. Результат получившегося мэтчера будет положительным, если все указанные мэтчеры также вернули положительные результаты.

String s = "abcdefg";
assertThat(s, allOf(startsWith("a"), endsWith("g"), containsString("cde"))); // passed
  • both

Более читабельный вариант мэтчера allOf для двух мэтчеров

String s = "1234";
assertThat(s, both(startsWith("1")).and(endsWith("4"))); // passed
  • anyOf

Позволяет объединить несколько мэтчеров. Результат получившегося мэтчера будет положительным, если хотя бы один из указанных мэтчеров вернет положительный результат

String s = "abcdefg";
assertThat(s, anyOf(startsWith("b"), endsWith("g"), containsString("rst"))); // passed
  • either

Более читабельный вариант мэтчера anyOf для двух мэтчеров

String s = "1234";
assertThat(s, either(startsWith("1")).or(endsWith("7"))); // passed
  • Not

Мэтчер, который вернет результат, обратный результату указанного мэтчера

String s = "1234";
assertThat(s, not(startsWith("_"))); // passed

Custom Matcher

Мэтчер, который будет проверять, что строка не более указанной длины

class ShortStringMatcher extends TypeSafeMatcher<String> {
 
    final private int length;
 
    public ShortStringMatcher(int length) {
        this.length = length;
    }
 
    @Override
    protected boolean matchesSafely(String item) {
        return item.length() < length;
    }
 
    @Override
    public void describeTo(Description description) {
        description.appendText("Length of string must be shorter than " + length);
    }
}

В методе matchesSafely мы будем получать строку, к которой будет применяться наш мэтчер. Соответственно, нам нужно проверить, что она не длиннее заданного лимита и вернуть true или false, как результат работы мэтчера.
В методе describeTo мы можем прописать текст, который появится в логах при негативном результате мэтчера.

Статический метод, чтобы использовать созданный мэтчер

public static Matcher<String> isShortString(int limit) {
    return new ShortStringMatcher(limit);
}
String s = "1234";
assertThat(s, isShortString(5)); // passed

Tutorial - Testing with Hamcrest

⚠️ **GitHub.com Fallback** ⚠️