junit5

单元测试用于验证一段代码是否按照开发人员的预期运行。 有时,这意味着检查代码是否也会引发预期的异常。 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

junit5

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

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

    单元测试用于验证一段代码是否按照开发人员的预期运行. 有时,这意味着检查代码是否也会引发预期的异常. 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. VMware Fusion指定虚拟机IP
  2. 大工18秋c c 语言程序设计,大工19秋《可编程控制器》在线作业3【满分答案】
  3. Zuul:构建高可用网关之多维度限流
  4. Atiti。流量提升软件设计大纲规划 v1 q45
  5. mac OS X中升级php5.5至php5.6 or php7
  6. LSTM神经网络Demystifying LSTM neural networks
  7. GitLab远程仓库迁移
  8. oracle管理用户安全,oracle中管理用户的安全
  9. java怎么给类中的私有变量赋值_Java核心技术笔记分享------第二章 类与对象
  10. 网络WIFI摄像机方案主控芯片最全介绍
  11. IT基础架构规划方案二(计算机系统与机房规划规划)
  12. 设计模式的C语言应用-导言-第一章
  13. 一加7pro运动计步功能_系统:一加推送一加7Pro的氢OS9.5.9系统版本更新,继续优化屏幕...
  14. java使用BZip算法压缩解压缩文件、数据流、byte[]字节数组
  15. Googletest Primer
  16. Ubuntu 18.10 下安装CUDA10/CUDA10.1
  17. Centos安装Docker的详细安装步骤
  18. arcgis运行慢_ArcGIS Desktop打开慢的解决办法
  19. 【Excel】数据的输入
  20. AutoK3s v0.4.8 发布 与 Harvester 梦幻联动

热门文章

  1. 算法设计与分析——分支限界法
  2. MCU与MPU的区别
  3. Arduino案例实操 -- 语音播放模块(DY-SV5W)
  4. storm和vgj vgj_DOTA2:VGJ改名J.Storm专注北美赛区,收编Forev新队进军Major
  5. redis查询所有key值,redis清除所有key值
  6. 文件隐藏的几种简单方法
  7. 阿里云服务器学生有什么优惠?阿里云学生机申请流程
  8. csgo怎么绑定一键跳投_CSGO投掷物一键跳投的设置方法
  9. 偏导数与全微分的计算
  10. 机器学习基础知识点⑤数据增强、类别不平衡