自定义hamcrest的Matcher
自定义hamcrest Matcher
在Junit中使用assertThat方法的时候第二个参数是一个hamcrest的Matcher 让Junit断言具有了很高的灵活性和可扩展性。
这里扩展一个大小比较的Matcher
首先自定义一个Matcher继承hamcrest的org.hamcrest.BaseMatcher
分别实现matches 和 describeTo
@Overridepublic boolean matches(Object actual) {// 是否通过assert}@Overridepublic void describeTo(Description description) {// 没有通过显示的信息}
在Junit使用即可
代码实现
功能: 实现一个大于 大于等于 小于 小于等于的Matcher
这里我使用了策略模式将具体的比较行为抽离成一个比较器,核心就是根据matches方法返回的boolean值判断是否断言成功
public class ComparatorMatcher<T extends Number> extends BaseMatcher<T> {public class ComparatorMatcher<T extends Number> extends BaseMatcher<T> {// 期望值private final T expected;private final Comparator<? super Number> comparator;private Object actual;public ComparatorMatcher(T expected, Comparator<Number> comparator) {this.expected = expected;this.comparator = comparator;}@Overridepublic boolean matches(Object actual) {this.actual = actual;if (actual instanceof Number) {Number actualNum = (Number) actual;return comparator.compare(expected, actualNum);}throw new UnsupportedOperationException(" not a number ");}@Overridepublic void describeTo(Description description) {description.appendText(String.format(" compactor error expected %s actual %s", String.valueOf(this.expected), String.valueOf(actual)));}@Factorypublic static <T extends Number> ComparatorMatcher<T> gt(T expected) {return new ComparatorMatcher<>(expected, new GtComparator<>(false));}@Factorypublic static <T extends Number> ComparatorMatcher<T> lt(T expected) {return new ComparatorMatcher<>(expected, new LtComparator<>(false));}@Factorypublic static <T extends Number> ComparatorMatcher<T> gte(T expected) {return new ComparatorMatcher<>(expected, new GtComparator<>(true));}@Factorypublic static <T extends Number> ComparatorMatcher<T> lte(T expected) {return new ComparatorMatcher<>(expected, new LtComparator<>(true));}
}
// 比较器接口
public interface Comparator<T extends Number> {boolean compare(T excepted, T actual);
}
// 大于比较器
public class GtComparator<T extends Number> implements Comparator<T> {private boolean isGte;public GtComparator(boolean isGte) {this.isGte = isGte;}@Overridepublic boolean compare(T excepted, T actual) {if (isGte) {return actual.doubleValue() >= excepted.doubleValue();}return actual.doubleValue() > excepted.doubleValue();}
}
// 小于比较器
public class LtComparator<T extends Number> implements Comparator<T> {private boolean isLte;public LtComparator(boolean isLte) {this.isLte = isLte;}@Overridepublic boolean compare(T excepted, T actual) {if (isLte) {return actual.doubleValue() <= excepted.doubleValue();}return actual.doubleValue() < excepted.doubleValue();}
}
// Junit 测试
public class TestCustomComparatorMatcher {@Testpublic void testMyMatcher() {assertThat(2, gt(1));assertThat(2, gte(2));assertThat(2, lt(4));assertThat(2, lte(4));assertThat(2, lte(2));}
}
自定义hamcrest的Matcher相关推荐
- idea内置junit5_JUnit的内置Hamcrest Core Matcher支持
idea内置junit5 在通过JUnit和Hamcrest改善对assertEquals的文章中,我简要讨论了Hamcrest " 核心 "匹配器与JUnit的现代版本" ...
- JUnit的内置Hamcrest Core Matcher支持
在用JUnit和Hamcrest改进assertEquals的文章中,我简要讨论了Hamcrest " 核心 "匹配器与JUnit的现代版本"结合"在一起的情况 ...
- matchers依赖_定制Hamcrest Matchers
matchers依赖 本文是我们名为" 用Mockito测试 "的学院课程的一部分. 在本课程中,您将深入了解Mockito的魔力. 您将了解有关"模拟",&q ...
- 定制Hamcrest Matchers
本文是我们名为" 用Mockito进行测试 "的学院课程的一部分. 在本课程中,您将深入了解Mockito的魔力. 您将了解有关"模拟","间谍&qu ...
- 在JUnit中超越核心Hamcrest
在通过JUnit和Hamcrest改进对assertEquals的文章中,我介绍了将Hamcrest与JUnit一起使用 . 然后,我查看了JUnit的内置Hamcrest Core Matcher支 ...
- Java 8 Friday:大多数内部DSL已过时
在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. Java 8星期五 每个星期 ...
- 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试
From: https://blog.wuwii.com/springboot-test.html 前言 JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提 ...
- 可以进行单元测试么_大量实例助攻,让你的单元测试更高效
关注[搜狐技术产品]公众号,第一时间获取技术干货 导读 单元测试作为程序员的必修课,对代码的稳定性起着关键性的作用,但是你真的会写单元测试么?什么才算是真正的单元测试?这些疑问你都将在文章中得到解答. ...
- SpringBoot_开发者工具与单元测试
开发者工具与单元测试 一.devtools 二.单元测试 三.新断言assertThat使用 一.devtools devtools简介 SpringBoot提供了一组开发工具spring-boot- ...
最新文章
- 独家 | Python利用深度学习进行文本摘要的综合指南(附教程)
- 如果说编程语言是一种宗教,你的信仰是?
- 中国金融出版社出版的2016版《个人贷款》
- c语言cin输入数组,C++基础:各种输入方法总结cin.get()、
- mysql buffer size_mysql read_buffer_size 设置多少合适
- 服务器系列和酷睿系列,三大系列 从英特尔主流处理器选择服务器(2)
- Echarts地图的基本使用方法
- Linux系统mysql半同步复制
- 爬虫技术——一篇全搞定!
- 爱奇艺逗芽表情搜索分析与实践
- 【附源码】计算机毕业设计SSM时事新闻管理系统
- 全球十大半导体企业,美国独占七席
- 2022在线客服系统可以给企业提供什么帮助呢?
- php读写excel文件
- ant design pro v5 - 07 多标签窗口 多窗口打开
- app软件流程图 如何做app软件流程图
- 单片机这个知识点一定要会!两大延时方法总结
- 【Android -- 相机】调用摄像头拍照 选择照片
- CAD制图中,如何隐藏布局视口线框?
- 山东联通套餐订购POST尝试
热门文章
- xp计算机出厂日期,xp电脑系统时间不对怎么办
- layui表格时间戳转换日期格式
- 弘辽科技:提升销量能增加店铺权重吗?如何做好?
- 人生就是不断突破自我的过程。
- 申请一个带表情的个性网站
- kibana 7.5.1 + metricbeat 7.5.1实现主机和kafka应用指标监控
- c语言圈复杂度switch,干货|C语言switch\/case圈复杂度优化重构
- STC15F104E单片机之EEPROM应用程序
- linux环境下命令行bypy、BaiduPCS 从百度网盘上传、下载数据
- java bean对象转换json对象时过滤空值