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")));





















  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值