一、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. Spring Boot2.0之整合Redis

    需要的maven依赖 jar包,是对Jedis的封装 maven依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  2. ODC(Orthogonal Defect Classification)简介——正交缺陷分类法

    Defect分析是软件开发和测试中一个重要的环节,ODC介绍了一种不同于大家常用的非常有效的defect分类及分析方法.这篇文章简单的向大家介绍了什么是ODC,以及如何在项目和产品开发中使用ODC来改 ...

  3. html5--6-24 css3前缀

    html5--6-24 css3前缀 学习要点 掌握css3前缀的使用 CSS3目前很多新增属性尚未被W3C列为标准,对这些暂时未被公布为标准的属性,各家浏览器会在属性前加上前缀词,也将其称之为浏览器 ...

  4. hdu1226

    hdu1226 :点击打开题目链接 本题目由于题目意思,容易得知是一道广搜的题目. 首先. 我们需要知道 ,大数取模,比如 如何判断1234567 对15 取模的数为多少?答案是7,但是如果他是大数怎 ...

  5. spring+mybatis下delete和insert返回值-2147482646

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"&g ...

  6. Divide the Sequence

    Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...

  7. 使用mysqlfrm恢复frm表结构,获得建表语句

    1.mysqlfrm 是一个恢复性质的工具,用来读取.frm文件并从该文件中找到表定义数据生成CREATE语句. 下载链接:https://downloads.mysql.com/archives/u ...

  8. HDOJ4857【拓扑排序】

    首先 CLJ ORZ 这道题做了两次,第一次瞎搞... 第二次,好吧,骄傲地说水过... 题意:不说了: 思路: 题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来: 第一次做的时候,我记得我 ...

  9. python 可迭代对象与迭代器之间的转换

    列表: >>> l = [1, 2, 3, 4] >>> l_iter = iter(l) >>> l_iter <list_iterato ...

  10. bzoj4517[Sdoi2016]排列计数(组合数,错排)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1792  Solved: 1111[Submit][Stat ...