一、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. console调试命令

    一.显示信息的命令 <!DOCTYPE html> <html> <head> <title>常用console命令</title> < ...

  2. Ubuntu下如何安装并使用Objective-C

    Objective-C是本人用过的最佳类C.面向对象的编程语言.Objective-C与标准C完美兼容,而在此基础上又加上了将面向对象的基础概念诠释得最好的SmallTalk元素,使得它既简洁.又灵活 ...

  3. hihocoder 1082 然而沼跃鱼早就看穿了一切 (替换指定的串 )

    #1082 : 然而沼跃鱼早就看穿了一切 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句 ...

  4. FZU1901 Period II —— KMP next数组

    题目链接:https://vjudge.net/problem/FZU-1901  Problem 1901 Period II Accept: 575    Submit: 1495Time Lim ...

  5. 【Nginx安装】CentOS7安装Nginx及配置

    [Nginx安装]CentOS7安装Nginx及配置 2018年03月05日 11:07:21 阅读数:7073 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttp ...

  6. 有关定时器setTimeout()、setInterval()详解

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. setTimeout() setTimeout函数用 ...

  7. vi编辑器设置行号可见

    vi 设置行号 需要切换到命令模式下,输入set number :set number 按下回车即可

  8. JAVASCRIPT技术 表达式验证

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

  9. asp.net微软图表控件MsChart

    前段时间,开发项目时,由于需要,需要将一些数据统计,并以图表形式显示.由于是asp.net,所以就找到了MsChart图表控件,还是挺方便实用的,分享一下. MsChart控件的主要组成如图所示 工具 ...

  10. java回调机制及其实现

    1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...