单元测试用于验证一段代码是否按照开发人员的预期运行。 有时,这意味着检查代码是否也会引发预期的异常。 JUnit是Java单元测试的标准,并提供了几种验证抛出异常的机制。 本文探讨了这些选项及其相对优点。
以下面的简单代码段为例。 除了编写测试以确保canVote()方法返回true或false之外,您还应该编写测试以验证是否在期望时抛出IllegalArgumentException

public class Student {public boolean canVote(int age) {if (i<=0) throw new IllegalArgumentException("age should be +ve");if (i<18) return false;else return true;}}

( 番石榴前提条件可能更适合这些参数检查,但该示例仍然有效)。

有3种常见的方法可以检查是否引发了异常,每种方法都有其自身的优缺点。

1)@Test(预期…)

@Test批注具有一个可选参数“ expected”,该参数允许您指定Throwable的子类。 如果我们想验证上面的canVote() ()方法抛出正确的异常,我们将编写:

@Test(expected = IllegalArgumentException.class)public void canVote_throws_IllegalArgumentException_for_zero_age() {Student student = new Student();student.canVote(0);}

简单明了,因为有点不精确,因为它测试将异常抛出到方法的某个地方,而不是放在特定的行上。

2)ExpectedException

要使用JUnit的ExpectedException ,首先需要声明ExpectedException:

@Rulepublic ExpectedException thrown= ExpectedException.none();

然后,您可以使用仅指定预期异常的更简单方法:

@Testpublic void canVote_throws_IllegalArgumentException_for_zero_age() {Student student = new Student();thrown.expect(NullPointerException.class);student.canVote(0);}

或者也可以指定预期的异常消息:

@Testpublic void canVote_throws_IllegalArgumentException_for_zero_age() {Student student = new Student();thrown.expect(IllegalArgumentException.class);thrown.expectMessage("age should be +ve");student.canVote(0);}

除了可以指定预期的异常消息之外,此ExpectedException方法还具有使您可以更精确地了解预期在何处引发异常的优点。 在上面的示例中,在构造函数中引发意外的IllegalArgumentException会导致测试失败,因为我们希望测试会在canVote()方法中引发。

附带一提,如果不需要声明,那就太好了:

@Rule public ExpectedException thrown= ExpectedException.none();

好像是不必要的噪音。 能够做的很好

expect(RuntimeException.class)

要么

expect(RuntimeException.class, “Expected exception message”)

或至少能够在一次对ExpectedException的调用中传递异常和消息:

thrown.expect(IllegalArgumentException.class, “age should be +ve”);

3)尝试/抓住断言/失败

在JUnit4之前,检查异常的方法是使用try / catch块。

@Testpublic void canVote_throws_IllegalArgumentException_for_zero_age() {Student student = new Student();try {student.canVote(0);} catch (IllegalArgumentException ex) {assertThat(ex.getMessage(), containsString("age should be +ve"));}fail("expected IllegalArgumentException for non +ve age");}

尽管这是一种较旧的方法,但仍然完全有效。 主要缺点是很容易忘记将fail()放在catch后面,如果未引发预期的异常,则会导致误报。 我过去肯定犯了这个错误!

总之,有三种主要的方法可以测试预期的异常情况,每种方法都有其自身的优缺点。 就我个人而言,由于它的精确度和测试异常消息的能力,我通常倾向于ExpectedException方法。

参考:来自Shaun Abram博客博客的JCG合作伙伴 Shaun Abram 在JUnit中测试了预期的异常 。

翻译自: https://www.javacodegeeks.com/2014/02/testing-for-expected-exceptions-in-junit.html

在JUnit中测试预期的异常相关推荐

  1. junit5_在JUnit中测试预期的异常

    junit5 单元测试用于验证一段代码是否按照开发人员的预期运行. 有时,这意味着检查代码是否也会引发预期的异常. JUnit是Java单元测试的标准,并提供了几种验证抛出异常的机制. 本文探讨了这些 ...

  2. junit 测试 异常_使用JUnit规则测试预期的异常

    junit 测试 异常 这篇文章展示了如何使用JUnit测试预期的异常. 让我们从我们要测试的以下类开始: public class Person {private final String name ...

  3. 使用JUnit规则测试预期的异常

    这篇文章展示了如何使用JUnit测试预期的异常. 让我们从我们要测试的以下类开始: public class Person {private final String name;private fin ...

  4. JUnit中测试异常抛出的方法

    最近在做TWU关于TDD的作业,对JUnit中测试异常抛出的方法进行了一些学习和思考. 在进行单元测试的时候有的时候需要测试某一方法是否抛出了正确的异常.例如,我有一个方法,里面对一个List进行读取 ...

  5. junit rule_使用@Rule在JUnit中测试文件和目录

    junit rule 多亏了TemporaryFolder @Rule在JUnit中使用文件和目录进行测试很容易. 在JUnit中,规则( @Rule )可以用作夹具设置和清除方法( org.juni ...

  6. 使用@Rule在JUnit中测试文件和目录

    多亏了TemporaryFolder @Rule在JUnit中使用文件和目录进行测试很容易. 在JUnit中,规则( @Rule )可以替代或设置夹具设置和清除方法( org.junit.Before ...

  7. Junit中测试插入等无返回值的操作要注意的问题

    问题一 到底插不插进数据库 由于测试数据有时比较随意,插入数据库会对数据库进行污染. 我们在测试的时候通过控制事务,一般不提交至数据库. 例如通过spring控制事务提交,默认让其回滚 @Transa ...

  8. expec不管异常 try_java – 如何使用ExpectedException规则在一个测试中测试多个异常?...

    简短的回答:你做不到. 如果第一次调用–foo.doStuff() – 抛出异常,你永远不会到达foo.doStuff(null).你必须把你的测试分成几个(对于这个简单的情况,我建议回到简单的符号, ...

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

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

最新文章

  1. 中新赛克数据可视化_中新赛克——能否构建更安全的世界
  2. 导入导出oracle数据库表的dmp文件
  3. 面向.NET开发人员的Dapr——俯瞰Dapr
  4. C++实现数组模拟链表(实现链表的增删功能)
  5. centos 安装idea 非可视化_太厉害了!目前 Redis 可视化工具最全的横向评测
  6. 3项目里面全局用less变量 cli vue_vue-cli3配置使用vw实现移动端适配案例
  7. Linux服务器非root用户下安装CUDA11.1和cudnn到指定目录
  8. 【转】关于PHP的header(P3P: CP=CURa……)
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_5_文件存储的原理和记事本打开文本显示原理...
  10. c语言式表白,c语言表白必备
  11. C语言:error C2084 函数“”已有主体
  12. No valid crumb was included in the request 问题定位与解决
  13. 测试用例评审的旁观记录
  14. 大数据第一季--Hadoop(day5)-徐培成-专题视频课程
  15. st-link下载连线
  16. php毕业论文致谢,毕业论文致谢词范文
  17. 【hackerrank】World CodeSprint 11 T6
  18. 《巴黎协定》生效 越南和印尼有望至2020年各新增5GW光伏容量
  19. dotnet C# 将 Byte 二进制数组使用不安全代码快速转换为 int 或结构体数组
  20. google protobuf 定义服务(service)

热门文章

  1. JavaWeb前端之AJAX的初步学习
  2. 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误
  3. 鸿蒙os更新要求,华为鸿蒙OS即将迎来升级 手机版本或仍需时间
  4. python中的数组按顺序切片_python切片(获取一个子列表(数组))详解
  5. python画建筑_专题 | Python 绘图入门
  6. Multi-catch parameters are not allowed for source level below 1.7 解决方法
  7. spring 消息传递机制_Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试...
  8. gradle junit5_JUnit 5和Selenium –使用Gradle,JUnit 5和Jupiter Selenium设置项目
  9. spring框架三层架构_Spring框架架构
  10. spring vaadin_在Spring Boot中使用Vaadin的简介