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.
Gradle
dependencies {
testImplementation "org.hamcrest:hamcrest:2.2"
}
Более читаемая форма.
Принимает значение actual и прогоняет его через Matcher, чтобы убедиться, что это значение удовлетворяет условиям, заданным в мэтчере.
import static org.hamcrest.CoreMatchers.*;
Мэтчеры для работы с объектами
Сравнивает, что два объекта равны (equals)
assertThat(s1, equalTo(s2));
assertEquals(s1,s2);
Выполняет проверку, что объект является инстанцией указанного класса.
assertThat(s1, instanceOf(String.class));
Проверка на null
assertThat(s1, nullValue());
Мэтчер is, это так называемый “синтаксический сахар”. Не несет никакого смысла, предназначен только для повышения читабельности теста.
assertThat(a, equalTo(b));
assertThat(a, is(equalTo(b)));
Проверка на не null
assertThat(s1, notNullValue());
Проверка, что значения являются одним и тем же объектом
String s1 = new String("1");
String s2 = new String("1");
assertThat(s1, sameInstance(s2));
Мэтчеры для работы со строками
Проверяет, что строка начинается с указанной строки
String s = "abcdefg";
assertThat(s, startsWith("abc"));
Проверяет, что строка заканчивается указанной строкой
String s = "abcdefg";
assertThat(s, endsWith("def"));
Проверяет, что строка содержит указанную строку
String s = "abcdefg";
assertThat(s, containsString("def"));
Мэтчеры для работы с коллекциями
Проверяет, что коллекция содержит указанный элемент
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
Проверяет, что коллекция содержит указанные элементы
List<String> list = Arrays.asList("one", "two", "three", "four", "five");
assertThat(list, hasItems("five", "six"));
Проверяет, что каждый элемент коллекции удовлетворяет указанному мэтчеру. Например, можно проверить, что все элементы начинаются с t.
List<String> list = Arrays.asList("one", "two", "three", "four", "five");
assertThat(list, everyItem(startsWith("t")));
Assert that expected and actual iterables are deeply equal
assertIterableEquals(savedNicknames, listSavedNicknames)
Мэтчеры, позволяющие создавать логические блоки (И, ИЛИ, НЕ) из нескольких мэтчеров.
Позволяет объединить несколько мэтчеров. Результат получившегося мэтчера будет положительным, если все указанные мэтчеры также вернули положительные результаты.
String s = "abcdefg";
assertThat(s, allOf(startsWith("a"), endsWith("g"), containsString("cde"))); // passed
Более читабельный вариант мэтчера allOf для двух мэтчеров
String s = "1234";
assertThat(s, both(startsWith("1")).and(endsWith("4"))); // passed
Позволяет объединить несколько мэтчеров. Результат получившегося мэтчера будет положительным, если хотя бы один из указанных мэтчеров вернет положительный результат
String s = "abcdefg";
assertThat(s, anyOf(startsWith("b"), endsWith("g"), containsString("rst"))); // passed
Более читабельный вариант мэтчера anyOf для двух мэтчеров
String s = "1234";
assertThat(s, either(startsWith("1")).or(endsWith("7"))); // passed
Мэтчер, который вернет результат, обратный результату указанного мэтчера
String s = "1234";
assertThat(s, not(startsWith("_"))); // passed
Мэтчер, который будет проверять, что строка не более указанной длины
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