junit 5测试异常处理_在JUnit中处理异常的3种方式。 选择哪一个?

junit 5测试异常处理

在JUnit中,有3种流行的方式来处理测试代码中的异常:

  • 试捕习语
  • 使用JUnit规则
  • 带注解

我们应该使用哪一个?何时使用?

试捕习语

这个习语是最受欢迎的习语之一,因为它已在JUnit 3中使用。

@Testpublic void throwsExceptionWhenNegativeNumbersAreGiven() {try {calculator.add("-1,-2,3");fail("Should throw an exception if one or more of given numbers are negative");} catch (Exception e) {assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("negatives not allowed: [-1, -2]");}}

上面的方法是一种常见的模式。 当没有引发异常并且在catch子句中验证了异常本身时,测试将失败(在上面的示例中,我使用了FEST Fluent断言),尽管它很好,但我更喜欢使用
ExpectedException规则。

使用JUnit规则

可以使用创建相同的示例
ExceptedException规则。 规则必须是标有@Rule批注的公共字段。 请注意,“抛出”规则可能会在许多测试中重复使用。

@Rulepublic ExpectedException thrown = ExpectedException.none();@Testpublic void throwsExceptionWhenNegativeNumbersAreGiven() {// arrangethrown.expect(IllegalArgumentException.class);thrown.expectMessage(equalTo("negatives not allowed: [-1, -2]"));// actcalculator.add("-1,-2,3");}

总的来说,我发现上面的代码更具可读性,因此我在项目中使用了这种方法。

当未引发异常时,您将收到以下消息: java.lang.AssertionError:预期引发的测试(java.lang.IllegalArgumentException的实例和带有消息“不允许负数的异常:[-1,-2]” ) 。 挺棒的。

但并非所有例外情况我都可以通过上述方法进行检查。 有时我只需要检查抛出的异常的类型,然后使用@Test批注。

带注解

@Test (expected = IllegalArgumentException.class)public void throwsExceptionWhenNegativeNumbersAreGiven() {// actcalculator.add("-1,-2,3");}

当未引发异常时,您将收到以下消息: java.lang.AssertionError:预期的异常:java.lang.IllegalArgumentException

使用这种方法时,您需要小心。 有时很容易想到一般的ExceptionRuntimeException甚至Throwable 。 这被认为是一种不好的做法,因为您的代码可能会在实际未预期的地方引发异常,并且测试仍将通过!

综上所述,在我的代码中,我使用两种方法: JUnit规则注释 。 优点是:

  • 代码不引发异常时的错误消息会自动处理
  • 可读性得到改善
  • 创建的代码更少

您的喜好是什么?

我听说过处理异常的第四种方式(我的一位同事在阅读本文后提出了建议)–使用自定义注释。

乍一看,实际上该解决方案看起来不错,但是它需要您自己的JUnit运行器,因此它有缺点:您不能将此批注与Mockito运行器一起使用。

作为编码实践,我创建了这样的注释,所以也许有人觉得它有用

用法

@RunWith(ExpectsExceptionRunner.class)
public class StringCalculatorTest {@Test@ExpectsException(type = IllegalArgumentException.class, message = "negatives not allowed: [-1]")public void throwsExceptionWhenNegativeNumbersAreGiven() throws Exception {// actcalculator.add("-1,-2,3");}}

上面的测试将失败,并显示一条消息: java.lang.Exception:意外的异常消息,预期的

但是是

注释

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ExpectsException {Class type();String message() default "";
}

带有复制和粘贴代码的跑步者

public class ExpectsExceptionRunner extends BlockJUnit4ClassRunner {public ExpectsExceptionRunner(Class klass) throws InitializationError {super(klass);}@Overrideprotected Statement possiblyExpectingExceptions(FrameworkMethod method, Object test, Statement next) {ExpectsException annotation = method.getAnnotation(ExpectsException.class);if (annotation == null) {return next;}return new ExpectExceptionWithMessage(next, annotation.type(), annotation.message());}class ExpectExceptionWithMessage extends Statement {private final Statement next;private final Class expected;private final String expectedMessage;public ExpectExceptionWithMessage(Statement next, Class expected, String expectedMessage) {this.next = next;this.expected = expected;this.expectedMessage = expectedMessage;}@Overridepublic void evaluate() throws Exception {boolean complete = false;try {next.evaluate();complete = true;} catch (AssumptionViolatedException e) {throw e;} catch (Throwable e) {if (!expected.isAssignableFrom(e.getClass())) {String message = "Unexpected exception, expected<"+ expected.getName() + "> but was <"+ e.getClass().getName() + ">";throw new Exception(message, e);}if (isNotNull(expectedMessage) && !expectedMessage.equals(e.getMessage())) {String message = "Unexpected exception message, expected<"+ expectedMessage + "> but was<"+ e.getMessage() + ">";throw new Exception(message, e);}}if (complete) {throw new AssertionError("Expected exception: "+ expected.getName());}}private boolean isNotNull(String s) {return s != null && !s.isEmpty();}}}

参考: 在JUnit中处理异常的3种方法。 选择哪一个? 从我们的JCG合作伙伴 Rafal Borowiec在Codeleak.pl博客上获得。

翻译自: https://www.javacodegeeks.com/2013/11/3-ways-of-handling-exceptions-in-junit-which-one-to-choose.html

junit 5测试异常处理

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

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

相关文章

python网站数据写入mysql_python网络爬虫抓取动态网页并将数据存入数据库MySQL

简述以下的代码是使用python实现的网络爬虫&#xff0c;抓取动态网页 http://hb.qq.com/baoliao/ 。此网页中的最新、精华下面的内容是由JavaScript动态生成的。审查网页元素与网页源码是不同。以上是网页源码以上是审查网页元素所以此处不能简单的使用正则表达式来获取内容。以…

交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM)

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 交通流预测 | Matlab基于KNN-BiLSTM的交通流预测&#xff08;对比SVR、LSTM、GRU、KNN-LSTM&#xff09; 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复Matlab基于KNN-BiLSTM的交通流预测&#xff08;对…

JMetro“ Metro”选项卡,Java的TreeView和ContextMenu(JavaFX)

我刚刚发布了JMetro的新更新&#xff0c;将版本升级到3.3.0。 在此更新中&#xff0c;您将找到&#xff1a; 新的TreeView Fluent设计系统&#xff08;Metro&#xff09;启发风格&#xff1b; 新的Tabs和TabPane FDS启发风格&#xff1b; 新的上下文菜单采用深色FDS启发的样…

蒙特卡罗计算积分matlab,matlab下二重积分的蒙特卡洛算法

%%monte_carlo_ff.m%被积函数(二重)function ffmonte_carlo_ff(x,y)ffx*y^2;%函数定义处end%%monte_carlo.m%蒙特卡洛计算二重积分function resultmonte_carlo(a,b,c,d,n,m)%先y后x积分&#xff0c;a是x积分下限&#xff0c;b是x积分上限&#xff0c;c是y积分下限&#xff0c;d…

数据挖掘原理与算法_技术分享|大数据挖掘算法之FPGrowth算法

程一舰数据技术处我们常说我们生活在信息时代&#xff0c;实际上&#xff0c;我们更多的还是生活在数据时代。因为从过去到现在累积了大量的数据&#xff0c;对数据的挖掘和分析也仅是从最近几年大数据和人工智能技术的发展而兴起。我们对现有数据价值的利用还远低于数据本身拥…

centos 程序 mysql数据库文件位置,CentOS 更改MySQL数据库目录位置

引言&#xff1a;由于MySQL的数据库太大&#xff0c;默认安装的/var盘已经再也无法容纳新增加的数据&#xff0c;没有办法&#xff0c;只能想办法转移数据的目录。下面我简单整理一下这几天把MySQL从/var/lib/mysql目录下面转移到/home/mysql_data/mysql下面具体操作1、首先我们…

neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集

neo4j数据浏览器在查看新的Neo4j数据库时&#xff0c;我发现遇到的一件困难就是确定其中包含的数据的结构。 我习惯于关系数据库&#xff0c;在该数据库中您可以轻松获取表列表和外键&#xff0c;以便您将它们相互连接。 传统上&#xff0c;使用Neo4j时很难做到这一点&#x…

mfc中怎么集成文件_怎么把几个pdf合并并打印在一份文件中?

a为什么我们要把pdf文件合并呢&#xff1f;当然我们要知道什么是pdf文件才能进行更多的操作&#xff0c;Pdf是我们许多人都会用到的一种存储文件的格式&#xff0c;它的内容基本是以图像的形式表现&#xff0c;所以我们在播放和打印的时候可以不用担心出现格式错乱的问题。PDF格…

php中日期选择代码,实现JS日期时间选择器

这次给大家带来实现JS日期时间选择器&#xff0c;实现JS日期时间选择器的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。flatpickr 是一个轻量级、注重精益、由 UX 驱动和可扩展的 JavaScript 日期时间选择器。下载 演示 GitHubflatpickr 不依赖于任何…

Jib –为Spring Boot应用程序构建docker映像

使用Jib为示例Spring Boot应用程序创建docker映像是如此容易&#xff0c;这让我感到惊喜。 让我首先将Jib与以前使用的方法进行对比。 我正在使用bmuschko出色的gradle-docker插件创建docker映像。 如果可以访问docker守护程序以及基于dockerfile或直接Dockerfile的gradle ds…

python中正则表达式是什么意思_python – 正则表达式中[^.] *的含义是什么?

我试图从以下文本中获得482.75&#xff1a;< span id “yfs_l84_aapl”> 482.75< / span>我使用的正则表达式是&#xff1a;regex ’< span id “yfs_l84 _ [^.] *”>(.&#xff1f;)< / span>‘它起作用了.但是我不明白的是为什么[^.] *可以在这里匹配…

php steam 第三方登录,Steam第三方登录

Steam第三方登录Laravel PHP7.3前端登录界面if(isset($steamprofile))window.οnlοadfunction(){var steamprofile {!!$steamprofile!!};var steamid {{$steamid}};if(steamid){$.post(/ajax/SocilaAuthLogin,{data:{userdata:steamprofile,type:steamLogin},},function(dat…

setitimer 创建两个定时器_UE4 Timer(定时器)相关源码分析

前言文章属于旧有文章搬运, 之前在csdn上面2019.11.6修改Timer是定时器, 用途:延时执行事件周期性执行事件参考官方文档Using TimersTimer可以...Timer能...Timer...... 编不下去了, 自己百度谷歌吧(手动狗头)TimerManagerTimer的管理类是FTimerManager, 是一个全局的Timer管理…

is array php,PHP 源码 — is_array 函数源码分析

php 中的 is_arrayphp 中的 is_array&#xff0c;它的签名是 is_array ( mixed $var ) : bool实现的源码在\ext\standard\type.c中可以找到PHP_FUNCTION(is_array)所处的位置&#xff0c;大概位于 273 行。在 PHP 中&#xff0c;这个系列的函数&#xff0c;是由很多个&#xff…

apache mahout_使用Apache Mahout创建在线推荐系统

apache mahout最近&#xff0c; 我们一直在为Yap.TV实施推荐系统&#xff1a;您可以在安装应用程序并转到“ Just for you”标签后才能看到它的运行情况。 我们以Apache Mahout为基础进行建议。 Mahout是一个“可扩展的机器学习库”&#xff0c;包含使用协作过滤算法的基于用户…

activitimq集群搭建_activitmq+keepalived+nfs 非zk的高可用集群构建

nfs192.168.10.32maast192.168.10.4savel192.168.10.31应对这个需求既要高可用又要消息延迟,只能使用变态方式实现nfs部署#yum install nfs-utils rpcbind#vim /etc/exports/data/activemq 192.168.10.31(rw,sync,no_root_squash,no_all_squash)/data/activemq 192.168.10.4(rw…

java50车架适合身高,【经验分享】身高与车架的选择

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼车架的长度&#xff1a;骑在车上&#xff0c;在正常握把时&#xff0c;眼睛、把立前端和前轮花鼓三点一线则说明车架长度正好&#xff0c;否则可通过更换不同长度的把立来调整长度。在Airborne网站上看到了度量身体个部位长度和计算…

Java应用程序的简单令牌认证

“我喜欢编写身份验证和授权代码。” 〜从来没有Web开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 JSON Web令牌已Swift成为保护Web应用程序安全的标准&#xff0c;并取代了Cookie和会话…

element手机验证格式_基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)...

前言开发过程中遇到了一个需求&#xff0c;根据用户选择的联系方式&#xff0c;动态改变输入框的检验条件&#xff0c;并且整个表单是可以增加的在线访问:动态表单校验github(欢迎star): https://github.com/Mrblackant. ..思考几个问题1.整个表单是可新增的&#xff0c;所以要…

matlab中rb代表什么意思,你知道“川藏线上”女游客举着“求RB”的牌子是啥意思吗?暗语啊!...

现在穷游好像一种旅行圈的时髦&#xff0c;很多人都想着穷游能够锻炼人的意志&#xff0c;能够促进人与人的交流与合作&#xff0c;能够在路上遇到不一样的精彩&#xff0c;能够发现人性与真善美。现在穷游的人不在少数&#xff0c;尤其是在川藏线上&#xff0c;想要穷游入藏的…