junit之Matcher,Assert.assertThat

本文基于junit-4.10

一、理解Matcher

为了详细说明assertThat的使用,我们需要了解Matcher这个接口及其实现类。

下面我们先直接看一下UML图,有个对相关接口和类的概念。

图一:Matcher接口,及其父接口和直接实现类


图二:BaseMatcher的子类



public interface Matcher<T> extends SelfDescribing {
    boolean matches(Object var1);

    void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}

上图是Matcher的源码,可以看到,它的内容很简单。matcher翻译过来的意思是匹配器,对于Matcher类型的变量,我们这里就将它称为匹配器。
对于一个匹配器,就是可接受值的一个匹配。比如,assertThat(8,is(8)); 判断8是不是8。其中is(8)返回的是一个Matcher类型的变量,也就是一个匹配器,在这里,它可接受的值是8. 
匹配器能够描述自身并在失败时给出反馈。
还有要注意的就是,Matcher的实现类不应该直接实现这个接口。相反,应该扩展BaseMatcher抽象类(例如上面的AnyOf,Is,IsAnything等都是扩展BaseMatcher抽象类),这将确保Matcher API可以扩展以支持新功能,
并保持与所有Matcher实现兼容。为了方便访问常见的Matcher实现,建议使用CoreMatchers中的静态工厂方法,CoreMatchers类引入了上述的BaseMatcher的子类,这样不用一个一个地访问BaseMatcher的直接子类。

org.hamcrest.CoreMatchers的UML图如下:



二、assertThat

初步了解assertThat

assertThat是org.junit.Assert类里的方法。Assert类的声明是:public class Assert extends Object.

现在,我们来看一下assertThat方法的声明:

static
<T> void
assertThat(String reason, T actual, Matcher<T> matcher) 
          Asserts that actual satisfies the condition specified by matcher.
static
<T> void
assertThat(T actual, Matcher<T> matcher) 
          Asserts that actual satisfies the condition specified by matcher.

先看第一个。方法有三个参数,第一个是字符串类型的reason,表示关于错误的额外信息,也就是你可以自己书写的错误提示信息。第二个参数是泛型的actual,表示的是被比较的值。

前两个参数都比较简单,复杂的是第三个Matcher<T>类型的参数matcher。此参数是一个表达式,由Matcher构建,指定第二个参数actual允许的值。

第二个和第一个一样,只是少了一个参数。作用和使用方法完全一致。

assertThat使用实例

(注意,本文基于junit-4.10,其它版本可能会有差异,请读者注意

测试的时候,我们使用org.hamcrest.CoreMatchers里的静态方法

(1)is和not

assertThat(5,org.hamcrest.CoreMatchers.is(5));
assertThat('a',is('a'));
assertThat("people",is("people"));

assertThat(new Date(),is(Date.class));
assertThat(5 ,not(6));
assertThat('a',not('b'));
assertThat("people",not("dog"));
assertThat("日期类型不是字符串类型",date,is(String .class));

(2)equalTo

assertThat(8,equalTo(8));

assertThat('a',equalTo('a'));

assertThat("java",equalTo("java"));

(3)instanceOf

assertThat(new Date(),instanceOf(java.util.Date.class));
assertThat("java",instanceOf(java.lang.String.class));
(4)allOf和anyOf
assertThat("必须包含字符串java和web","java web",org.hamcrest.CoreMatchers.allOf(containsString("java"),containsString("web")));
assertThat("不是color,也不是colour","color",anyOf(containsString("color"), containsString("colour")));
(5)either

assertThat("color",either(containsString("color")).or(containsString("colour")));





















发布了10 篇原创文章 · 获赞 3 · 访问量 5451

猜你喜欢

转载自blog.csdn.net/AttleeTao/article/details/71104581