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测试异常处理

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

  1. junit 5测试异常处理_使用JUnit 5测试异常

    junit 5测试异常处理 JUnit 5带来了令人敬畏的改进,并且与以前的版本有很大不同. JUnit 5在运行时需要Java 8,因此Lambda表达式可以在测试中使用,尤其是在断言中. 这些断言 ...

  2. es重建字段类型_关于elasticsearch中更新数据的几种方式

    作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式. (一)更新文档 (1)部分更新: java api: ` HashMa ...

  3. 简述java中异常_柴涛666 的日志-简述java中处理异常的两种方式。

    抓try 抛throwspackage 异常; import java.util.Scanner; public class a { public static void main(String[] ...

  4. 项目敏捷管理模式有哪几种_敏捷团队中有效沟通的5种模式

    项目敏捷管理模式有哪几种 我们的沟通方式是雇主在招聘时所寻求的最重要的技能组合. 它对成本,生产力,团队士气和员工在工作场所的保留率有重大影响. <经济学人>进行的一项研究表明,沟通中的问 ...

  5. sh执行文件 参数传递_详解shell中脚本参数传递的两种方式

    方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${ ...

  6. java类初始数组_java中数组初始化的三种方式是什么

    java中数组初始化的三种方式是:1.静态初始化,如[int a[] = {2, 0, 1, 9, 2020}]:2.动态初始化,如[int[] c = new int[4]]:3.默认初始化,如[i ...

  7. 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators

    Microsoft在最新的C#版本中引入了Source Generator.这是一项新功能,可以让我们在代码编译时生成源代码.在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作.然后,您 ...

  8. Android中播放音乐的几种方式

    Android中播放音乐的几种方式 前言 前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalye ...

  9. 控制器中接收数据的四种方式

    控制器中接收数据的四种方式: (仅限于个别的方式(get/post)有效) 通过形参的方式接收表单提交的数据(可以接收post与get提交的数据): 注释: GetData自己定义的方法名里面存入形参 ...

最新文章

  1. python装饰器简单理解
  2. JS发送跨域Post请求出现两次请求的解决办法
  3. Cauchy-Schwarz Inequality for Integrals for any two functions clarification
  4. swagger快速开发
  5. 妈的,混蛋 wfopen_s 函数
  6. spring boot: spring Aware的目的是为了让Bean获得Spring容器的服务
  7. 数据结构快速掌握和温习-面试神器
  8. 第二专业 计算机考试成绩查询系统,2021年上半年信息系统项目管理师成绩查询时间公布(7月12日),查询入口已开通!...
  9. redis-springboot-redistemplate更改序列化方式
  10. Mysql事务,并发问题,锁机制-- 幻读、不可重复读--专题
  11. 列表标签(HTML)
  12. Android 测试 之MonkeyRunner
  13. linux 共享内存管理,什么是物理/虚拟/共享内存——Linux内存管理小结一
  14. NB-IoT 基于蜂窝的窄带物联网
  15. Python 爬取豆瓣影片短评 生成词云统计
  16. 2019最新个税计算_python
  17. 遥感的自然生态监测 专题
  18. DSP TMS320C5509A 控制DDS AD9854芯片进行FSK调制
  19. C. K-th Not Divisible by n
  20. 一夜之间,几十万人失去房票!

热门文章

  1. 纪中C组模拟赛总结(2019.7.5)
  2. 2018陕西省赛K题[watermelon_planting]
  3. codeforces E. Picking Strings 构造
  4. 史上最全的 MySQL 高性能优化实战总结
  5. ByteBuffer的使用
  6. 线程间协作的两种方式:wait、notify、notifyAll和Condition
  7. switch case 支持的 6 种数据类型
  8. Sentinel流控规则持久化
  9. SpringMVC的上传与下载
  10. 服务器母鸡系统,母鸡云服务器