Contents

Hamcrest中CoreMatchers简介

1. 概述

在本快速教程中,我们将探索 流行的Hamcrest 框架中的CoreMatchers类 ,以编写简单且更具表现力的测试用例。

这个想法是让 assert 语句读起来像自然语言。

2. Hamcrest 设置

我们可以通过将以下依赖项添加到我们的 pom.xml 文件来将 Hamcrest 与 Maven 一起使用:

<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<T>)

is(T)将一个对象作为参数来检查是否相等,而is(Matcher<T>) 采用另一个匹配器,使相等语句更具表现力。

我们可以将其与几乎所有方法一起使用

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

3.2. equalTo(T)

equalTo(T)将一个对象作为参数并检查它是否与另一个对象相等。**这经常与is(Matcher<T>)一起使用:

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 operand) – 它检查相等性并且不强制两个对象应该具有相同的静态类型:

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

3.3. not(T) 和 not(Matcher<T>)

not(T) 和 not(Matcher<T>) 用于检查给定对象的不相等性。首先将一个对象作为参数,然后将另一个匹配器作为参数:

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<T>)

*nullValue()针对被检查的对象检查空 值。*nullValue(Class<T>)*检查给定类类型对象的可空性:

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

3.5. notNullValue()notNullValue(Class<T>)

**这些是常用的*is(not(nullValue))*的快捷方式。**这些检查对象或类类型的非空相等性:

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

3.6. instanceOf(Class<?>)

如果检查的对象是指定Class类型的实例,则instanceOf(Class<?*>)*匹配。

为了验证,这个方法内部调用了Class类的isIntance(Object)

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

3.7. isA(Class<T> type)

isA(Class<T> type) 是上述instanceOf(Class<?>)的快捷方式。**它采用与instanceOf(Class<?*>)完全相同类型的参数*:

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<T>)

*any(Class<T>)*检查类是否与实际对象属于同一类型:

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

3.10. allOf(Matcher<? extends T*>…)* 和 anyOf(Matcher<? extends T*>…)*

我们可以使用allOf(Matcher<? extends T*>…)* 断言实际对象是否匹配所有指定条件:

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

anyOf  ( Matcher <  ?

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

3.11. hasItem(T)hasItem(Matcher<? extends T*>)*

如果检查的Iterable集合与*hasItem()或 hasItem(Matcher<? extends T>)*中的给定对象或匹配器匹配,则这些匹配。

让我们了解这是如何工作的:

List<String> list = Lists.newArrayList("java", "spring", "blogdemo");
assertThat(list, hasItem("java"));
assertThat(list, hasItem(isA(String.class)));

同样,我们也可以 使用hasItems(T…)hasItems(Matcher<? extends T>…)对多个项目进行断言

List<String> list = Lists.newArrayList("java", "spring", "blogdemo");
assertThat(list, hasItems("java", "blogdemo"));
assertThat(list, hasItems(isA(String.class), endsWith("ing")));

3.12. both(Matcher<? extends T*>)* 和 either(Matcher<? extends T*>)*

顾名思义,both(Matcher<? extends T*>)*在两个指定条件都匹配检查对象时匹配:

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

并且 either(Matcher<? extends T*>)*在任一指定条件与检查的对象匹配时匹配:

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

4. String比较

我们可以使用containsString(String) 或*containsStringIgnoringCase(String)*来断言实际字符串是否包含测试字符串:

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

或者 *startsWith(String)*和 *startsWithIgnoringCase(String)*断言实际字符串是否以测试字符串开头:

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

我们还可以使用 *endsWith(String)*或 endsWithIgnoringCase(String) 来断言实际字符串是否以测试字符串结尾:

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