«1. Обзор

В этом кратком руководстве мы рассмотрим класс CoreMatchers из популярной среды Hamcrest для написания простых и более выразительных тестовых случаев.

Идея состоит в том, чтобы операторы assert читались как естественный язык.

2. Настройка Hamcrest

Мы можем использовать Hamcrest с Maven, добавив следующую зависимость в наш файл pom.xml:

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>java-hamcrest</artifactId>
    <version>2.0.0.0</version>
    <scope>test</scope>
</dependency>

Последнюю версию этой библиотеки всегда можно найти здесь.

3. Общие средства сопоставления ядер

3.1. is(T) и is(Matcher\u003cT\u003e)

is(T) принимает объект в качестве параметра для проверки равенства, а is(Matcher\u003cT\u003e) принимает другой сопоставитель, позволяющий оператору равенства быть более выразительным.

Мы можем использовать это почти со всеми методами:

String testString = "hamcrest core";

assertThat(testString, is("hamcrest core"));
assertThat(testString, is(equalTo("hamcrest core")));

3.2. equalTo(T)

Метод equalTo(T) принимает объект в качестве параметра и проверяет его равенство с другим объектом. Это часто используется с is(Matcher\u003cT\u003e):

String actualString = "equalTo match";
List<String> actualList = Lists.newArrayList("equalTo", "match");

assertThat(actualString, is(equalTo("equalTo match")));
assertThat(actualList, is(equalTo(Lists.newArrayList("equalTo", "match"))));

Мы также можем использовать equalToObject(операнд объекта) — который проверяет равенство и не требует, чтобы два объекта имели один и тот же статический тип: ~~ ~

Object original = 100;
assertThat(original, equalToObject(100));

3.3. not(T) и not(Matcher\u003cT\u003e)

not(T) и not(Matcher\u003cT\u003e) используются для проверки неравноправия заданных объектов. Первый принимает объект в качестве аргумента, а второй — другой сопоставитель:

String testString = "troy kingdom";

assertThat(testString, not("german kingdom"));
assertThat(testString, is(not(equalTo("german kingdom"))));
assertThat(testString, is(not(instanceOf(Integer.class))));

3.4. nullValue() и nullValue(Class\u003cT\u003e)

Функция nullValue() проверяет наличие нулевого значения в проверяемом объекте. nullValue(Class\u003cT\u003e) проверяет допустимость значения NULL для данного объекта типа класса:

Integer nullObject = null;

assertThat(nullObject, is(nullValue()));
assertThat(nullObject, is(nullValue(Integer.class)));

3.5. notNullValue() и notNullValue(Class\u003cT\u003e)

Это ярлык для часто используемого is(not(nullValue)). Они проверяют ненулевое равенство объекта или типа класса:

Integer testNumber = 123;

assertThat(testNumber, is(notNullValue()));
assertThat(testNumber, is(notNullValue(Integer.class)));

3.6. instanceOf(Class\u003c?\u003e)

instanceOf(Class\u003c?\u003e) совпадает, если проверяемый объект является экземпляром указанного типа Class.

Для проверки этот метод внутренне вызывает isIntance(Object) класса Class:

assertThat("instanceOf example", is(instanceOf(String.class)));

3.7. isA(тип Class\u003cT\u003e)

isA(тип Class\u003cT\u003e) является ярлыком для вышеупомянутого instanceOf(Class\u003c?\u003e). Он принимает тот же тип аргумента, что и instanceOf(Class\u003c?\u003e):

assertThat("Drogon is biggest dragon", isA(String.class));

3.8. sameInstance()

Функция sameInstance() соответствует, если две ссылочные переменные указывают на один и тот же объект в куче:

String string1 = "Viseron";
String string2 = string1;

assertThat(string1, is(sameInstance(string2)));

3.9. any(Class\u003cT\u003e)

Any(Class\u003cT\u003e) проверяет, относится ли класс к тому же типу, что и фактический объект:

assertThat("test string", is(any(String.class)));
assertThat("test string", is(any(Object.class)));

3.10. allOf(Matcher\u003c? extends T\u003e…) и anyOf(Matcher\u003c? extends T\u003e…)

Мы можем использовать allOf(Matcher\u003c? extends T\u003e…) для утверждения, соответствует ли фактический объект все указанные условия:

String testString = "Achilles is powerful";
assertThat(testString, allOf(startsWith("Achi"), endsWith("ul"), containsString("Achilles")));

AnyOf(Matcher\u003c? extends T\u003e…) ведет себя как allOf(Matcher\u003c? extends T\u003e…), но соответствует, если проверяемый объект соответствует любому из указанных условия:

String testString = "Hector killed Achilles";
assertThat(testString, anyOf(startsWith("Hec"), containsString("baeldung")));

3.11. hasItem(T) и hasItem(Matcher\u003c? extends T\u003e)

Соответствуют, если проверяемая коллекция Iterable совпадает с заданным объектом или сопоставителем внутри hasItem() или hasItem(Matcher\u003c? extends T\u003e).

Давайте разберемся, как это работает:

List<String> list = Lists.newArrayList("java", "spring", "baeldung");

assertThat(list, hasItem("java"));
assertThat(list, hasItem(isA(String.class)));

Точно так же мы можем утверждать против более чем одного элемента, используя hasItems(T…) и hasItems(Matcher\u003c? extends T\u003e…):

List<String> list = Lists.newArrayList("java", "spring", "baeldung");

assertThat(list, hasItems("java", "baeldung"));
assertThat(list, hasItems(isA(String.class), endsWith("ing")));

3.12. оба(Сопоставитель\u003c? расширяет T\u003e) и любой(Сопоставитель\u003c? расширяет T\u003e)

Как следует из названия, оба(Сопоставитель\u003c? расширяет T\u003e) совпадают, когда оба указанных условия соответствуют исследуемому объекту: ~ ~~

String testString = "daenerys targaryen";
assertThat(testString, both(startsWith("daene")).and(containsString("yen")));

и либо(Matcher\u003c? extends T\u003e)соответствует, когда любое из указанных условий соответствует проверяемому объекту:

String testString = "daenerys targaryen";
assertThat(testString, either(startsWith("tar")).or(containsString("targaryen")));

4. Сравнение строк

Мы можем использовать containsString(String) или containsStringIgnoringCase( String), чтобы подтвердить, содержит ли фактическая строка тестовую строку:

String testString = "Rhaegar Targaryen";
assertThat(testString, containsString("aegar"));
assertThat(testString, containsStringIgnoringCase("AEGAR"));

Или opensWith(String) и startsWithIgnoringCase(String), чтобы подтвердить, начинается ли фактическая строка с тестовой строки:

assertThat(testString, startsWith("Rhae"));
assertThat(testString, startsWithIgnoringCase("rhae"));

Мы также можем использовать endWith (String) или endWithIgnoringCase(String), чтобы подтвердить, заканчивается ли фактическая строка тестовой строкой:

assertThat(testString, endsWith("aryen"));
assertThat(testString, endsWithIgnoringCase("ARYEN"));

5. Заключение

В этой статье мы обсудили различные методы класса CoreMatchers в библиотеке Hamcrest.

И, как всегда, исходный код примеров можно найти на GitHub.