一、Hamcrest简介

  Hamcrest是一个用于编写匹配器(matcher)对象的框架,允许以声明方式定义“匹配(match)”规则。它可以与JUnit框架配合使用,使断言可读更高,更加灵活(例如判断数组、集合、map中的内容等)。

Hamcrest支持多种语言,本文只使用JAVA语言。Hamcrest官网:http://hamcrest.org/

二、Java Hamcrest 常用匹配器

    @Test
public void testAssertThatWithHamcrest() { /**
* 核心:
*/
//anything:总是匹配,如果你不关心测试下的对象是什么是有用的
assertThat("随便是个啥", anything("总是匹配就完事了"));
//describedAs:添加一个定制的失败表述装饰器
assertThat("zs", describedAs("自定义故障描述",equalTo("zs")));
//is:改进可读性装饰器 ,底层is(equalTo(value))
assertThat("zs",is("zs")); /**
* 逻辑:
*/
//allOf:所有匹配器都匹配才匹配,相当于 &&
assertThat("张三", allOf(startsWith("张"), containsString("三")));
//anyOf:任何匹配器匹配就匹配,相当于 ||
assertThat("张三",anyOf(startsWith("李"),containsString("三")));
// not:包装的匹配器不匹配器时匹配,相当于与取反
assertThat("tom",not("lucy")); /**
* 对象:
*/
//equalTo:测试对象相等使用Object.equals方法
assertThat("foo", equalTo("foo"));
//hasToString:测试Object.toString方法
assertThat(true, hasToString(equalTo("true")));
//instanceOf, typeCompatibleWith:测试类型
assertThat("string", instanceOf(String.class));
assertThat(Integer.class, typeCompatibleWith(Number.class));
//notNullValue, nullValue:测试null
assertThat(null,nullValue());
assertThat("",notNullValue());
//sameInstance:测试对象实例
Integer number = new Integer(200);
assertThat(number,sameInstance(number)); /**
* Beans:
*/
@Data
class MyClass{
private String name;
}
//hasProperty:测试JavaBeans属性
assertThat(new MyClass(),hasProperty("name")); /**
* 集合:
*/
//array:测试一个数组元素,每一项是否匹配
assertThat(new Integer[]{1,2,3}, is(array(equalTo(1), equalTo(2), equalTo(3))));
//hasEntry, hasKey, hasValue :测试一个Map包含一个实体,键或者值
Map<String,Integer> map = new HashMap<>();
map.put("张三",23);
map.put("李四",24);
assertThat(map,hasEntry("张三",23));
assertThat(map,hasKey("李四"));
assertThat(map,hasValue(23));
//hasItem, hasItems:测试一个集合包含一个元素
assertThat(Arrays.asList("foo", "bar"),hasItem(startsWith("ba")));
assertThat(Arrays.asList("foo", "bar", "baz"), hasItems(endsWith("z"), endsWith("o")));
//hasItemInArray:测试一个数组包含一个元素
assertThat(new String[] {"foo", "bar"}, hasItemInArray(startsWith("ba"))); /**
* 数字:
*/
// closeTo:测试浮点值接近给定的值,该匹配器在+/-error范围内匹配
assertThat(1.03, is(closeTo(1.0, 0.04)));
//greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo :测试次序
assertThat(2, greaterThan(1));
assertThat(1, greaterThanOrEqualTo(1));
assertThat(1, lessThan(2));
assertThat(1, lessThanOrEqualTo(1)); /**
* 文本:
*/
//equalToIgnoringCase:测试字符串相等忽略大小写
assertThat("Foo", equalToIgnoringCase("FOO"));
//equalToIgnoringWhiteSpace:测试字符串忽略空白
assertThat(" my\tfoo bar ", equalToIgnoringWhiteSpace(" my foo bar"));
//containsString, endsWith, startsWith:测试字符串匹配
assertThat("myStringOfNote", containsString("ring"));
assertThat("myStringOfNote", endsWith("Note"));
assertThat("myStringOfNote", startsWith("my")); }

三、自定义匹配器

示例代码:

import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher; /**
* 自定义匹配器,判断年龄范围在[1,200]返回true
* 1、继承TypeSafeMatcher并指定泛型
* 2、重写matchesSafely、describeTo方法
* 3、提供外部调用的静态方法
*/
public class IsNormalAgeRange extends TypeSafeMatcher<Integer> { @Override
public boolean matchesSafely(Integer number) {
return number >=1 && number <=200;
} @Override
public void describeTo(Description description) {
description.appendText("need to be within [1,200]");
} public static Matcher normalAgeRange() {
return new IsNormalAgeRange();
} }

测试:

    @Test
public void testMyMatcher() {
assertThat(100, IsNormalAgeRange.normalAgeRange());
}

JUnit的好搭档-Hamcrest的更多相关文章

  1. 【Junit】JUnit-4.12使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误

    下载了最新的JUnit版本,是4.12,结果尝试使用发现总是报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing这样的错误, 上网查 ...

  2. [转]JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误

    原文引自: http://blog.csdn.net/castle07/article/details/8553704 今天尝试使用JUnit,下载了最新的JUnit版本,是4.11,结果尝试使用发现 ...

  3. junit浅学笔记

    JUnit是一个回归测试框架(regression testing framework).Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(Wh ...

  4. JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误

    今天尝试使用JUnit,下载了最新的JUnit版本,是4.11,结果尝试使用发现总是报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribi ...

  5. 一个简单的JUnit项目

    本人一直很喜欢JAVA,可是真正接触到JUnit也不过半年.由于公司进行网页测试,采用的是 JUnit+selenium的方式搭建的测试框架,然后采用JAVA语言编写,所以本人也好好研究了一下JUni ...

  6. JUnit——(二)注解

    1. 两种错误:Error和Failure Error是代码错误 @Test publicvoid testAdd() { int z=new T().add(5,3); assertEquals(8 ...

  7. Junit4X系列--hamcrest的使用

    OK,在前面的一系列博客里面,我整理过了Assert类下面常用的断言方法,比如assertEquals等等,但是org.junit.Assert类下还有一个方法也用来断言,而且更加强大.这就是我们这里 ...

  8. java错误分析之junit测试错误(实验一)

    本文转自:https://www.cnblogs.com/anny0404/p/5275595.html 在原作者的基础上进行部分添加,也很感谢原作者这篇博文,帮我分析与解决问题! 原文: 下载了最新 ...

  9. 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

    前言 JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量. JUnit 测试框架具有以下重要特性: 测试工具 测试套件 测试运行器 测试分类 了 ...

随机推荐

  1. Hadoop 中的 (side data) 边数据

    一.用途 边数据是作业所需的额外的只读数据,通常用来辅助主数据集: 二.方法 1.利用Configuration类来配置,利用setter()和getter()可方便的使用,方便存储一些基本的类型: ...

  2. django-sso单点登陆的实现

    环境准备 环境规格: python3.5 django2.0 django-simple-sso-0.14 环境安装: pip install django-simple-sso-0.14 环境说明: ...

  3. 织梦DedeCMS信息发布员发布文章默认自动审核更新并生成HTML页面

    织梦DedeCMS信息发布员发布文章默认自动审核更新并生成HTML页面 一直以为DEDECMS的信息发布员在后台发布文章后,非要管理员审核才能显示,今天一哥们问我这个问题.问:“能不能直接发布,并自动 ...

  4. JAVASCRIPT技术 表达式验证

    失去焦点时,调用方法: <html> <head><script type="text/javascript">function upperCa ...

  5. random和string模块

    random模块import randomprint(random.random()) #随机打印一个浮点数print(random.randint(1,5)) #随机打印一个整数,包括5print( ...

  6. Redmine 数据库连接错误

    /******************************************************************** * Redmine 数据库连接错误 * 说明: * Open ...

  7. 【系列】 2-SAT

    bzoj 1997 Planar 题目大意: 给一个存在曼哈顿回路的无向图,求该图是否为平面图 思路: 先把曼哈顿回路提出来,则剩下的边的两个端点若有$ABAB$的形式则这两条边必定一个在环外一个在环 ...

  8. CQOI2013 新数独

    传送门 这道题也是很暴力的搜索啊…… 因为数独一开始全是空的,只有许许多多的大小限制条件,那也没必要纠结从哪开始搜索了,直接暴力搜索之后判断一下是否合法. 这题最恶心的是读入.现学了一招判断点在哪个块 ...

  9. Laravel 5.4 中的异常处理器和HTTP异常处理实例教程

    错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器 ...

  10. bzoj4566

    后缀自动机+dp 一个串在另一个串上跑. 先对A建出自动机,然后用B在上面跑,记录当前匹配的最大长度,每次经过一个节点记录经过次数,并加上(len-Max(par))*Right,是这个状态对答案的贡 ...