匹配器
Matchers是JUnit框架的外部补充。匹配器由称为Hamcrest的框架添加。 JUnit 4.8.2在内部随Hamcrest一起提供,因此我们不必下载它,也不必自己添加它。
匹配器与org.junit.Assert.assertThat()方法一起使用,如下所示:
public void assertThat(Object o, Matcher matcher){ ... }
我们可以实现自己的Matcher,但是JUnit(Hamcrest)附带了一些可以使用的内置匹配器。这里有一些例子:
import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import org.junit.Test; public class MyMatcherTest { @Test public void testWithMatchers() { assertThat("this string", is("this string")); assertThat(123, is(123)); } }
" assertThat()"方法采用一个对象和" Matcher"实现。由"匹配器"确定测试是否通过。 " assertThat()"方法只处理" plumming",意思是使用给定的对象调用" Matcher"。
JUnit(实际上是Hamcrest)附带了可以使用的内置匹配器集合。在上面的示例中,使用org.hamcrest.CoreMatchers.is()方法创建了Matcher。如果比较的两个值相等,则由is()返回的Matcher返回true,否则返回false。
如果Matcher
返回false,则assertThat
方法将引发异常。如果Matcher
返回true,则assertThat()
方法正常返回。 "匹配器"如何返回true或者false,我将在本文后面再讲。现在,想象一下它可以做到。
链式匹配器
我们可以链接一些匹配器,例如:
@Test public void testWithMatchers() { assertThat(123, not( is(345) ) ); }
注意链接调用not(is(345))
。这实际上是两个匹配器的总和。 is()方法返回一个匹配器,而not()方法返回另一个匹配器。由not()返回的匹配器将否定输入的匹配器的匹配器输出。在这种情况下,取反的是is()方法返回的匹配器的输出。
核心匹配者
在开始实现自己的Matcher
之前,我们应该先查看JUnit随附的核心匹配器。这是匹配器方法的列表:
单元格不一致
实际上,以上所有方法都是静态方法,它们采用不同的参数,并返回" Matcher"。
我们将不得不与匹配者一起玩一些,然后再抓住他们。他们可以很方便。
自定义匹配器
我们可以编写自己的匹配器,然后插入assertThat()
方法。这是一个例子:
public static Matcher matches(final Object expected){ return new BaseMatcher() { protected Object theExpected = expected; public boolean matches(Object o) { return theExpected.equals(o); } public void describeTo(Description description) { description.appendText(theExpected.toString()); } }; }
静态方法matches()
创建一个新的匹配器并返回它。
该匹配器是BaseMatcher类的匿名子类。 JUnit文档指出,我们应该始终扩展BasreMatcher
而不是自己实现Matcher
接口。因此,如果将来将新方法添加到" Matcher"中,则" BaseMatcher"可以实现它们。然后,子类也将自动获得这些方法。这样可以避免破坏代码。
这是使用此自定义匹配器的方法:
@Test public void testThat() { MyUnit myUnit = new MyUnit(); assertThat(myUnit.getTheSameObject(), matches("constant string")); }
很简单,不是吗?我们只需将对静态方法" matches()"的调用嵌入在" assertThat()"方法内。