一、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. access函数的使用检查文件的权限【学习笔记】

    #include "apue.h" #include <fcntl.h> int main(int argc,char **argv) { ) err_quit(&qu ...

  2. POJ3680 Intervals —— 区间k覆盖问题(最小费用流)

    题目链接:https://vjudge.net/problem/POJ-3680 Intervals Time Limit: 5000MS   Memory Limit: 65536K Total S ...

  3. IO、FileInputStream、(二十)

    1.IO流概述及其分类 * 1.概念(什么是IO?) * IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流 ...

  4. stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性(java基础知识十三)

    1.StringBuffer类的概述 * A:StringBuffer类概述 * 通过JDK提供的API,查看StringBuffer类的说明 * 1.线程安全的可变字符序列. * 2.可将字符串缓冲 ...

  5. hdu 1514 Free Candies 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514 题目意思:有4堆糖果,每堆糖果有n个,从上到下排好,取糖果只能从上往下取,取完的糖果放在篮子里, ...

  6. ComboBox联动 (AJAX BS实现)

    //从webservice中取数据ajax            Ext.Ajax.request({                url: 'WebService.asmx/GetComboxFi ...

  7. I.MX6 eMMC分区挂载

    /********************************************************************* * I.MX6 eMMC分区挂载 * 说明: * 如果想要 ...

  8. MyBatis学习 之 五、MyBatis配置文件

    在定义sqlSessionFactory时需要指定MyBatis主配置文件: <bean id="sqlSessionFactory" class="org.myb ...

  9. python-----删除列表中某个元素的3种方法

    python中关于删除list中的某个元素,一般有三种方法:remove.pop.del: 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除举例说明: >>> st ...

  10. [转]Python+Selenium之expected_conditions:各种判断(上)

    原文地址: https://www.jianshu.com/p/f3189f1951cc 其他类似文章: https://www.cnblogs.com/yuuwee/p/6635652.html h ...