junit rule_使用JUnit的ExpectedException和@Rule测试自定义异常

junit rule

异常测试

为什么要测试异常流? 就像所有代码一样,测试覆盖率在代码和应该产生的业务功能之间写了一个合同,从而为您提供了代码的有效文档 ,以及可以尽早且经常强调功能的附加功能。 我不会介绍测试的许多好处,而是只关注异常测试。

有很多方法可以测试从一段代码引发的异常流。 假设您有一个受保护的方法,该方法要求参数不为null。 您将如何测试该状况? 引发异常时,如何防止JUnit报告失败? 该博客涵盖了几种不同的方法使用JUnit的的ExpectedException使用JUnit的@rule功能实现的高潮。

“旧”方式

在不久的将来,测试异常的过程需要大量的样板代码,您将在其中启动try / catch块,如果代码未产生预期的行为,则报告失败,然后捕获异常以查找异常。具体类型。 这是一个例子:

public class MyObjTest {@Testpublic void getNameWithNullValue() {try {MyObj obj = new MyObj();myObj.setName(null);fail('This should have thrown an exception');} catch (IllegalArgumentException e) {assertThat(e.getMessage().equals('Name must not be null'));}}
}

从这个旧示例中可以看到,测试用例中的许多行只是为了支持缺少专门测试异常处理的功能。 使用try / catch方法的一个好处是可以测试特定消息和预期异常上的任何自定义字段 。 我们将通过JUnit的ExpectedException和@Rule注释进一步探讨这一点。

JUnit添加预期的异常

JUnit通过添加@Test注释字段“ expected”来响应用户对异常处理的需求。 目的是,如果抛出的异常类型与注释中存在的异常类匹配,则整个测试用例将通过。

public class MyObjTest {@Test(expected = IllegalArgumentException.class)public void getNameWithNullValue() {MyObj obj = new MyObj();myObj.setName(null);}
}

从较新的示例中可以看到,样板代码要少得多,并且测试非常简洁,但是存在一些缺陷 。 主要缺陷是测试条件太宽泛。 假设您在签名中有两个变量,并且两个变量都不能为null,那么您如何知道IllegalArgumentException抛出了哪个变量呢? 当您扩展了Throwable并需要检查字段的存在时会发生什么? 在继续阅读时,请记住这些,随后将有解决方案。

JUnit @Rule和ExpectedException

如果查看前面的示例,可能会看到期望抛出IllegalArgumentException,但是如果您有一个自定义异常,该怎么办? 如果要确保该消息包含特定的错误代码或消息怎么办? 这是JUnit真正出色的地方,它提供了专门为异常测试量身定制的JUnit @Rule对象。 如果您不熟悉JUnit @Rule,请在此处阅读文档 。

ExpectedException

JUnit提供了一个JUnit类ExpectedException,旨在用作@Rule。 ExpectedException允许您的测试声明预期会出现异常,并为您提供一些基本的内置功能来清楚地表达预期的行为。 与@Test(expected)批注功能不同,ExpectedException类允许您通过Hamcrest匹配器库测试特定的错误消息和自定义字段。

JUnit的ExpectedException的示例

import org.junit.rules.ExpectedException;public class MyObjTest {@Rulepublic ExpectedException thrown = ExpectedException.none();@Testpublic void getNameWithNullValue() {thrown.expect(IllegalArgumentException.class);thrown.expectMessage('Name must not be null');MyObj obj = new MyObj();obj.setName(null);}
}

如前所述,该框架允许您测试特定消息,以确保在测试专门寻找的情况下抛出异常。 当多个参数的可空性受到质疑时,这非常有用。

自定义字段

可以说,ExpectedException框架最有用的功能是能够使用Hamcrest匹配器测试您的自定义/扩展异常。 例如,您有一个自定义/扩展的异常,该异常将在方法中引发,并且异常内部具有“ errorCode”。 如何在不从上面列出的try / catch块中引入样板代码的情况下测试该功能? 定制匹配器怎么样?

可以从以下网址获得此代码: https : //github.com/mike-ensor/custom-exception-testing

解决方案:首先是测试用例

import org.junit.rules.ExpectedException;public class MyObjTest {@Rulepublic ExpectedException thrown = ExpectedException.none();@Testpublic void someMethodThatThrowsCustomException() {thrown.expect(CustomException.class);thrown.expect(CustomMatcher.hasCode('110501'));MyObj obj = new MyObj();obj.methodThatThrowsCustomException();}
}

解决方案:自定义匹配器

import com.thepixlounge.exceptions.CustomException;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;public class CustomMatcher extends TypeSafeMatcher<CustomException> {public static BusinessMatcher hasCode(String item) {return new BusinessMatcher(item);}private String foundErrorCode;private final String expectedErrorCode;private CustomMatcher(String expectedErrorCode) {this.expectedErrorCode = expectedErrorCode;}@Overrideprotected boolean matchesSafely(final CustomException exception) {foundErrorCode = exception.getErrorCode();return foundErrorCode.equalsIgnoreCase(expectedErrorCode);}@Overridepublic void describeTo(Description description) {description.appendValue(foundErrorCode).appendText(' was not found instead of ').appendValue(expectedErrorCode);}
}

注意:请访问https://github.com/mike-ensor/custom-exception-testing以获得可用的Hamcrest Matcher,JUnit @Rule和ExpectedException的副本。

在那里,您可以快速概览一下测试代码引发的异常的不同方法,以及从自定义异常类中测试特定消息和字段的能力。 请具体说明您的测试用例,并尝试针对已为测试设置的确切用例,请记住,测试可以避免引入副作用漏洞!

祝您编程愉快,别忘了分享!

参考:在Mike的站点博客上,从JCG合作伙伴 Mike 那里 ,使用JUnit的ExpectedException和@Rule测试自定义异常 。


翻译自: https://www.javacodegeeks.com/2012/10/testing-custom-exceptions-with-junits.html

junit rule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经纬度1秒约等于多少米?

WGS84坐标系统下&#xff08;通常我们采用的GPS内的坐标系统&#xff09; 如果是中国常用的WGS1984的经纬度坐标&#xff0c;1秒相当于33米。具体如下&#xff1a; 经度1度85.39km 经度1分 1.42km 经度1秒 23.6m 纬度1度 大约111km 纬度1分 大约1.85km 纬度1秒 大约30.9m

学计算机单招可以报那几个公立学校,为什么要选择公办单招学校,四川公办单招学校有哪些?...

高职单招单招被称为春季高考&#xff0c;在四川参加单招考试的学生逐年上升&#xff0c;周时参加单招的高职院校也越来越多。但是单招不像是高考可以通过不同的志愿&#xff0c;来填报多所学校。单招只能选择某一个学校&#xff0c;一旦确定就不能更改。这样的结果就是选择学校…

AutoValue:生成的不可变值类

Google GitHub托管的项目AutoValue之所以有趣&#xff0c;有多种原因。 该项目不仅使为“ 值对象 ”编写更少的Java代码变得容易&#xff0c;而且还为Java注释处理的实际应用提供了概念上简单的演示。 该自动/值项目是由提供谷歌的员工凯文Bourrillion和埃蒙麦克马纳斯和许可与…

exit(0)与exit(1)、return区别

exit&#xff08;0&#xff09;&#xff1a;正常运行程序并退出程序&#xff1b; exit&#xff08;1&#xff09;&#xff1a;非正常运行导致退出程序&#xff1b; return&#xff08;&#xff09;&#xff1a;返回函数&#xff0c;若在主函数中&#xff0c;则会退出函数并返回…

上海教师计算机等级要求,计算机考试阅卷教师谈等级考试

等级考试笔试是由选择题和填空题两大部分组成。选择题是由阅卷系统改卷&#xff0c;而填空题是由阅卷教师评阅&#xff0c;下面我们就从分析阅卷的得分丢分情况来谈谈如何让阅卷教师在公平、公正的前提下尽可能的给予"高分"&#xff0c;让考生尽量避免不必要的"…

C++读取文本文件中以TAB作为分隔符,且中间字段有为空的情况的方法?

数据文件&#xff1a;testData.txt 内容&#xff1a; 111 222 444 555思路&#xff1a; getline()将testData.txt中的第一行记录读入到一个string中&#xff0c;然后搜索第n个分隔符进行定位&#xff0c;判断第n个字段长度&#xff0c;使用substr&#x…

宿迁学计算机的学校,宿迁计算机学校

01、宿迁计算机学校培养目标培养学生具有基本的审美能力&#xff0c;利用常用的平面设计软件进行多媒体产品开发、广告设计与创意、印刷品的设计、展览展示等能力&#xff0c;能够从事多媒体产品开发&#xff0c;广告设计与创意&#xff0c;印刷品的设计&#xff0c;展览展示等…

javaone_JavaOne 2012:调查JVM水晶球

javaone我周一回到了希尔顿的A / B广场参加第四届会议&#xff0c;但首先去了希尔顿的顶层收拾午餐。 我每年都在JavaOne的第一天被提醒&#xff0c;对于参与的每个人来说&#xff0c;第一天的午餐获取过程令人惊讶地令人沮丧。 我知道我在JavaOne的第一年的经历使我有些困惑&a…

VS2008编译boost库

一、下载 首先从boost官方主页http://www.boost.org/下载最新版boost安装包&#xff0c;我用的版本是boost.1.49.0 二、新建文件夹 如果是使用下载的安装包&#xff0c;那么请将boost安装包解压至本地新建的目录&#xff0c;如&#xff1a;F:\boost 三、编译 &#xff08;1&am…

rtk采点后如何导入cad_【干货】RTK实操视频:工程之星5.0操作攻略!(第五部分)...

前期回顾&#xff1a;【干货】RTK实操视频&#xff1a;工程之星5.0操作攻略&#xff01;(第一部分)【干货】RTK实操视频&#xff1a;工程之星5.0操作教程(第二部分)【干货】RTK实操视频&#xff1a;工程之星5.0操作攻略&#xff01;(第三部分)【干货】RTK实操视频&#xff1a;工…

Git----分支管理之分支管理策略04

通常&#xff0c;合并分支时&#xff0c;如果可能&#xff0c;Git会用Fast forward模式&#xff0c;但这种模式下&#xff0c;删除分支后&#xff0c;会丢掉分支信息。 如果要强制禁用Fast forward模式&#xff0c;Git就会在merge时生产一个新的commit&#xff0c;这样&#xf…

测试英语语法的软件,1Checker,一款实用的英语语法检测软件

语法检测软件众多&#xff0c;使用最顺手的是1Checker。因为工作原因&#xff0c;每两年都要发表至少一篇英文期刊&#xff0c;可我的英文水平写专业论文很欠缺&#xff0c;又不愿意花钱找人翻译检测。就在网上寻找相关的软件&#xff0c;1Checker不是我第一个使用的语法检测软…

企业是否应该实现对客户需求的快速响应_如何做好企业服务?

2018 年&#xff0c;企业级服务仍处于高速增长时期。经过几年的市场洗礼后&#xff0c;企业级服务的市场格局正在逐步明朗。无论是垂直型还是通用型的企业级服务厂商&#xff0c;公司发展核心问题主要围绕客户满意度、产品成熟度、企业健康度三方面:①产品成熟度。成熟的 B 端产…

JavaScript的匿名函数

匿名函数&#xff0c;没有函数名的函数&#xff0c;这种函数一般使用变量来存放。匿名函数的声明方式类似普通函数&#xff0c;一般使用变量保存起来。 示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

OpenMap教程5 – 3层GIS应用程序

1.简介 欢迎使用OpenMap系列教程的第5个教程。 OpenMap是一个免费的开源Java GIS库。 这是以前的教程列表&#xff1a; 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图…

Linux Shell——-if -eq,if -ne,if -gt[笔记]

-eq //等于 -ne //不等于 -gt //大于 -lt //小于 ge //大于等于 le //小于等于

中国计算机手机全部被黑,云南一高校电脑全被黑

0云南一高校电脑全被黑2016-10-14 21:20据云南高校新鲜事儿10月14日消息&#xff0c;网友爆料&#xff0c;云南大学本部文渊楼授课电脑全部被黑。{"info": {"setname": "云南一高校电脑全被黑","imgsum_bk": 4,"imgsum": 4,…

CIFAR和SVHN在各CNN论文中的结果

CIFAR和SVHN结果 加粗表示原论文中该网络的最优结果。可以看出DenseNet-BC优于ResNeXt优于DenseNet优于WRN优于FractalNet优于ResNetv2优于ResNet。ResNeXt-29&#xff0c;8x64d表示29层&#xff0c;ResNeXt分支数为8&#xff0c;每个分支的bottleneck宽度为64。这里记录的结果…

c++可以做什么项目_上班做下班后可以做的兼职项目

当今社会我们常常听到有人抱怨成年人的世界里从来没有容易二字&#xff0c;无论你是在家带娃&#xff0c;还是正常上班。你会觉得消费水平在不断的上涨&#xff0c;但工资却永不见涨。眼看着入不敷出&#xff0c;除了心里急的火急火燎&#xff0c;心里还想着怎样赚到更多的钱&a…

excel中自动填充到最后一行

excel中如果中间没有空行&#xff0c;通过双击黑色十字可自动填充到最后一行&#xff0c;但如果数据中间空行多并且数据多&#xff0c;双击黑色十字只可以填充到空行前面的一行。 这时&#xff0c;可使用ctrlenter组合键实现自动填充。 1、先选中要填充的单元格 2、输入公式 3、…