匹配器

时间:2020-01-09 10:35:39  来源:igfitidea点击:

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()"方法内。