使用过Junit 的应该有过体验:在实际开发中,一些基本的断言,如eqaul,null,true它们的可读性并不是很好。而且很多时候我们要比较对象、集合、Map等数据结构。这样我们要么进行大段的字段获取再断言。或者干脆自己编写表达式并断言其结果。
JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。

Hamcrest 提供了大量被称为“匹配器”的方法。其中每个匹配器都设计用于执行特定的比较操作。Hamcrest的可扩展性很好,让你能够创建自定义的匹配器。最重要的是,JUnit也包含了Hamcrest的核心,提供了对Hamcrest的原生支持,可以直接使用Hamcrest。

类图



类实现

hamcrest架构中,主要实现匹配器(Matcher),因此Matcher作为顶层类型。

Matcher

public interface Matcher<T> extends SelfDescribing {//验证对象是否匹配。此处用Object,因为在运行时不知道是什么类型,由实现类决定boolean matches(Object item);//**构造不匹配的缘由。**void describeMismatch(Object item, Description mismatchDescription);
}

BaseMatcher

BaseMatcher作为所有匹配器的基类,不建议直接实现Matcher接口。

public abstract class BaseMatcher<T> implements Matcher<T> {@Overridepublic void describeMismatch(Object item, Description description) {description.appendText("was ").appendValue(item);}@Overridepublic String toString() {return StringDescription.toString(this);}
}

具体匹配器

名称 用途 说明
CustomMatcher 仅用于作为匿名内部类的父类
DescribedAs 为其他Matcher提供一个Description
AllOf 判断多个Mathcer是否同时true。短路方式
IsInstanceOf 判断是否是指定class的实例
PropertyMatcher 判断属性值是否匹配
Is 装饰一个其他Matcher
IsAnything always return true
IsEmptyString 判断不为空字符串
IsEqual 判断是否equal
IsIn 是否是集合元素
IsNot 装饰一个其他Matcher,判断Matcher不匹配
IsNull 判断对象是否为null
IsSame 判断对象是同一个
AnyOf 判断多个Mathcer是否有一个true。短路方式
TypeSafeMatcher 类型安全匹配器。把一个类方便的转化为一个Matcher
TypeSafeDiagnosingMatcher 类型安全诊断匹配器。把一个类方便的转化为一个Matcher,并报告为什么不匹配。

类型安全匹配器

名称 用途 说明
BigDecimalCloseTo 是否近似某个值
HasProperty 是否有属性
IsArray 集合是否一一匹配一组Matcher
IsArrayContaining 集合是否有一个元素匹配
IsCloseTo 是否近似某个值
IsCompatibleType 一个类是否是另一个类的子类
IsEmptyCollection 是否是一个空集合
IsEmptyIterable 迭代是否是空的
IsEqualIgnoringCase 是否相同,忽略大小写
IsEqualIgnoringWhiteSpace 是否相同,忽略空白
IsMapContaining<K,V> Map是否有一个元素匹配
OrderingComparison<T extends Comparable> 大小比较
StringContainsInOrder String集合是否都以…开头
SubstringMatcher 子串匹配
ThrowableMessageMatcher 异常信息匹配

ReflectiveTypeFinder

此类找到某个类包含某个方法的superclass,从下往上查找。

类型安全诊断匹配器

名称 用途 说明
CombinableMatcher 组合匹配器 and,or,
Every 每个元素都匹配
HasPropertyWithValue 属性值匹配
HasXPath xml匹配
IsCollectionContaining 有集合元素匹配
IsEventFrom 事件源是同一个对象
SamePropertyValuesAs
IsIterableContainingInAnyOrder
IsIterableContainingInOrder
FeatureMatcher<T, U>

Dsecription

描述不匹配情况的类。每个Matcher描述自己的匹配情况。

NullDescription

丢弃信息

BaseDescription

基础Description,存储为字符串

StringDescription

继承于BaseDescription。存储为String。

Sample

public class Person {String name;int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(String name){this.name =name;}
}
public class HamcrestTest {public static void main(String[] args){Person person = new Person("tom");//IsAnything<Person> anything = new IsAnything<>();boolean matched = anything.matches(person);System.out.println("anything:" + matched);IsEmptyString isEmptyString = new IsEmptyString();matched = isEmptyString.matches("555");System.out.println("isEmptyString:" + matched);IsEqual<Person> isEqual = new IsEqual<Person>(person);matched = isEqual.matches(person);System.out.println("isEqual:" + matched);IsNull<Person> isNull = new IsNull<>();matched = isNull.matches(person);System.out.println("isNull:" + matched);IsSame<Person> isSame = new IsSame<Person>(person);matched = isSame.matches(person);System.out.println("isEqual:" + matched);Is<Person> is = new Is<>(isEqual);matched = is.matches(person);System.out.println("is:" + matched);IsNot<Person> isNot = new IsNot<>(isEqual);matched = isNot.matches(person);System.out.println("isNot:" + matched);IsInstanceOf isInstanceOf = new IsInstanceOf(person.getClass());matched = isInstanceOf.matches(person);System.out.println("isInstanceOf:" + matched);List<Matcher<? super Person>> matchers = new ArrayList<>();matchers.add(is);matchers.add(isSame);AllOf<Person> allOf = new AllOf<Person>(matchers);matched = allOf.matches(person);System.out.println("allOf:" + matched);AnyOf<Person> anyOf = new AnyOf<Person>(matchers);matched = anyOf.matches(person);System.out.println("anyOf:" + matched);HasProperty<Person> hasProperty = new HasProperty<>("name");matched = hasProperty.matches(person);System.out.println("hasProperty:" + matched);HasPropertyWithValue<Person> hasPropertyWithValue = new HasPropertyWithValue<Person>("name",new IsEqual<String>("tom"));matched = hasPropertyWithValue.matches(person);System.out.println("hasPropertyWithValue:" + matched);}
}

结果:

anything:true
isEmptyString:false
isEqual:true
isNull:false
isEqual:true
is:true
isNot:false
isInstanceOf:true
allOf:true
anyOf:true
hasProperty:true
hasPropertyWithValue:true

注意:与属性有关的Matcher,必须保证测试类是public的,方法是public的。

hamcrest详细介绍相关推荐

  1. HTML页面加载和解析流程详细介绍

    浏览器加载和渲染html的顺序.如何加快HTML页面加载速度.HTML页面加载和解析流程等等,在本文将为大家详细介绍下,感兴趣的朋友不要错过 浏览器加载和渲染html的顺序 1. IE下载的顺序是从上 ...

  2. mysql为什么要压测_mysql集群压测的详细介绍

    本篇文章给大家带来的内容是关于mysql集群压测的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. mysql压测 mysql自带就有一个叫mysqlslap的压力测试工具,通 ...

  3. php比较运算符案列,PHP实例:PHP比较运算符的详细介绍

    <PHP实例:PHP比较运算符的详细介绍>要点: 本文介绍了PHP实例:PHP比较运算符的详细介绍,希望对您有用.如果有疑问,可以联系我们. 比拟运算符种类 PHP实战如同它们名称所暗示的 ...

  4. Tempdb数据库详细介绍

    Tempdb数据库详细介绍 一.Tempdb简介 tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象.可以简单理解tempdb是SQLServer的 ...

  5. linux路由介绍,Linux的路由表详细介绍

    Linux的路由表详细介绍 一 在Linux下执行route命令[root@localhost backup]# route -nKernel IP routing tableDestination ...

  6. pythonexcel介绍_Python 中pandas.read_excel详细介绍

    Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r& ...

  7. 渡神纪帧数测试软件,渡神纪芬尼斯崛起配置要求高吗 渡神纪配置要求详细介绍_游侠网...

    渡神纪芬尼斯崛起配置要求高吗?本作将在12月3日登陆主机和PC,很多玩家比较关心游戏的配置,这里给大家带来了渡神纪配置要求详细介绍,快来了解下吧. 渡神纪配置要求详细介绍 最低要求(720p/30 f ...

  8. C++11 unordered_map详细介绍

    整理的算法模板合集: ACM模板 目录: 1.介绍 1.1 特性 2. 模版 2.1 迭代器 3. 功能函数 3.1 构造函数 3.2 容量操作 3.2.1 size 3.2.2 empty 3.3 ...

  9. autosar中com模块_详细介绍AUTOSAR各个模块作用PART1(OS,SYS)

    这片文章中我们详细讲解下每个模块的功能,上图是vector的autosar方案,每个模块的详细介绍后续会有单独文章进行讲解,请关注.以下是各个模块的简介 1.VHSM hardware Securit ...

最新文章

  1. 通过poi操作ppt中的图片
  2. java不可变量有哪些_5.Java变量
  3. Hama笔记:Unable to load native-hadoop library 和 Snappy native library not loaded 的解决
  4. HTML5学习笔记(一)(2015-12-2)【新浪云搬运】
  5. 利用Oracle虚拟私有数据库进行整合
  6. 怎么在php项目安装tp5框架,框架安装与基本配置
  7. 用python编写杨辉三角金字塔_用python实现三道简单算法题:杨辉三角,蛇形矩阵,金字塔...
  8. node mysql 连接池创建_Node.js使用MySQL连接池的方法实例
  9. OenLayers 事件注册
  10. 数据结构上机实践第四周项目2 - 建设“单链表”算法库
  11. libfaac个个参数说明
  12. 乔布斯:你须寻得所爱(转)
  13. Windows Media Player 键盘快捷键
  14. js开源框架最新版下载
  15. 阿里巴巴的商品主图视频要怎么保存比较快
  16. 中国工商注册企业统计数据
  17. 古剑奇谭显示服务器维修,《古剑奇谭网络版》角色转服功能说明公告
  18. 诺贝尔经济学奖与数学
  19. iOS苹方字体使用说明
  20. live555直播startplaying

热门文章

  1. [导入]较为周全的Asp.net提交验证方案 (下)
  2. 【SpringBoot】SpingBoot整合AOP
  3. nodejs的事件循环1
  4. [Apache Tomcat]server.xml文件详解
  5. HMAILSERVER集成WEB邮件系统(ROUNDCUBE WEBMAIL)
  6. 高性能MySQL-3rd-(六)查询性能优化
  7. SQLPlus 在连接时通常有四种方式
  8. window server 2012 IE10 增强的安全设置 如何关闭
  9. 看起来很美 VS. 是你来检阅我的忧伤了吗?
  10. linux 的内核参数优化,linux 内核参数优化