Java 8的AssertJ 3.0.0发行版比以前更容易测试异常。 在我以前的一篇博客文章中,我描述了如何利用 Java 8实现此目的,但是使用AssertJ 3.0.0可能会删除我创建的许多代码。

警告:此博客文章主要包含代码示例。

SUT –被测系统

我们将测试以下2类抛出的异常。

第一个:

class DummyService {public void someMethod() {throw new RuntimeException("Runtime exception occurred");}public void someOtherMethod(boolean b) {throw new RuntimeException("Runtime exception occurred",new IllegalStateException("Illegal state"));}
}

第二个:

class DummyService2 {public DummyService2() throws Exception {throw new Exception("Constructor exception occurred");}public DummyService2(boolean dummyParam) throws Exception {throw new Exception("Constructor exception occurred");}
}

assertThatThrownBy()示例

注意:为了使以下代码正常工作,需要静态导入org.assertj.core.api.Assertions.assertThatThrownBy

@Test
public void verifiesTypeAndMessage() {assertThatThrownBy(new DummyService()::someMethod) .isInstanceOf(RuntimeException.class).hasMessage("Runtime exception occurred").hasNoCause();
}@Test
public void verifiesCauseType() {assertThatThrownBy(() -> new DummyService().someOtherMethod(true)).isInstanceOf(RuntimeException.class).hasMessage("Runtime exception occurred").hasCauseInstanceOf(IllegalStateException.class);
}@Test
public void verifiesCheckedExceptionThrownByDefaultConstructor() {assertThatThrownBy(DummyService2::new).isInstanceOf(Exception.class).hasMessage("Constructor exception occurred");
}@Test
public void verifiesCheckedExceptionThrownConstructor() {assertThatThrownBy(() -> new DummyService2(true)).isInstanceOf(Exception.class).hasMessage("Constructor exception occurred");
}

所提供的断言来自AbstractThrowableAssert ,您可以使用更多的断言!

没有异常抛出!

以下测试将失败,因为不会引发异常:

@Test
public void failsWhenNoExceptionIsThrown() {    assertThatThrownBy(() -> System.out.println());
}

消息是:

java.lang.AssertionError: Expecting code to raise a throwable.

AAA风格

如果您希望区分测试的行动阶段和断言阶段以提高可读性,则还可以:

@Test
public void aaaStyle() {// arrangeDummyService dummyService = new DummyService();// actThrowable throwable = catchThrowable(dummyService::someMethod);// assertassertThat(throwable).isNotNull().hasMessage("Runtime exception occurred");
}

参考文献

  • GitHub上提供了本文的源代码 (请查看com.github.kolorobot.assertj.exceptions包)
  • AssertJ 3.0.0 for Java 8版本

翻译自: https://www.javacodegeeks.com/2015/04/junit-testing-exceptions-with-java-8-and-assertj-3-0-0.html

JUnit:使用Java 8和AssertJ 3.0.0测试异常相关推荐

  1. JUnit 4 如何正确测试异常

    我们在用 JUnit 测试方法异常的时候,最容易想到的办法就是用 try-catch 去捕获异常,需要断言以下几个条件: 1. 确实抛出的异常  2. 抛出异常的 Class 类型  3. 抛出异常的 ...

  2. java 拼sql最大长度,java.sql.SQLNonTransientConnectionException: 用户 ID 长度 (0) 超出 1 到 255 的范围...

    使用Derby数据库进行JUnit测试时, 报出了org.springframework.transaction.CannotCreateTransactionException: Could not ...

  3. java junit 异常_JUnit:使用Java 8和Lambda表达式测试异常

    java junit 异常 在JUnit中,有许多方法可以在测试代码中测试异常,包括try-catch idiom JUnit @Rule和catch-exception库. 从Java 8开始,我们 ...

  4. JUnit:使用Java 8和Lambda表达式测试异常

    在JUnit中,有许多方法可以在测试代码中测试异常,包括try-catch idiom JUnit @Rule和catch-exception库. 从Java 8开始,我们还有另一种处理异常的方法:使 ...

  5. 第64节:Java中的Spring Boot 2.0简介笔记

    Java中的Spring Boot 2.0简介笔记 spring boot简介 依赖java8的运行环境 多模块项目 打包和运行 spring boot是由spring framework构建的,sp ...

  6. Java 近期新闻:Grail 5.0、Spring、Hibernate、WildFly 及 Kotlin Multik 开发库更新

    2021 年 10 月 11 日起始周 Java 新闻更新:OpenJDK.JDK 18.Spring Framework.Grails 5.0.Micronaut 3.1.Helidon 2.3.4 ...

  7. java写抽象类的测试_如何使用JUnit在Java中测试抽象类?

    如何使用JUnit在Java中测试抽象类? 我是JUnit的Java测试新手. 我必须使用Java,我想使用单元测试. 我的问题是:我有一个带有一些抽象方法的抽象类. 但是有些方法并不是抽象的. 如何 ...

  8. java me sdk_Java ME SDK 3.0不运行的问题及解决

    Java ME SDK 3.0不运行的问题及解决 最近想实现一个在自己手机上查询汉字拼音的程序,已经进行了大概20天了吧.但是上周的时候在Netbeans 6.8中运行程序,在输出中显示的是" ...

  9. Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到 17 了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 ‍ ‍文章来源:程序猿DD‍ ‍ 2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M ...

最新文章

  1. 还在加班做数据吗?今天1分钟教你学会用Python轻松玩转Excel
  2. oracle4045,ORACLE 错误 4045
  3. 成功解决Runtime Error Selected KDE bandwidth is 0. Cannot estiam
  4. SAP Leonardo Machine Learning处于deprecated状态的API和其替代者
  5. linux svn启动和关闭(转)
  6. npm audit fix
  7. js基础-7-数组去重的es5和es6写法、数组扁平化
  8. Java 案例三 随机点名器
  9. 计算机与科学的论文,计算机与科学技术论文要求.doc
  10. Python爬取2万条微博热搜,带你揭开热搜趋势!
  11. 计算机毕业设计springboot+vue+elementUI高校志愿者管理系统(源码+系统+mysql数据库+Lw文档)
  12. 关于travis scott的网名_小仙女可爱单纯的网名
  13. 贝壳CVR转化率预估模型实践
  14. Android APK加固(加壳)工具
  15. 【经验分享】设置电脑定时开关机
  16. plc控制柜图纸怎么看呢?
  17. centos7 安装mysql5.7.37 实操说明
  18. 6G网络潜在关键技术研究综述
  19. 中国移动,联通,电信
  20. LTE数据速率低的原因及优化方法

热门文章

  1. java知识点总结(二)
  2. numpy 数组抽取_清晰易懂的Numpy入门教程
  3. 转】Eclipse编辑Spring配置文件xml时自动提示类class包名
  4. 如何不用 List.clear() 方法 就清空 list 中的 所有元素(中兴面试)
  5. 后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如
  6. posman mocks_使用Mocks进行需求驱动的软件开发
  7. spring api层打包_Spring项目的按层打包已过时
  8. javafx 浏览器_浏览器中的JavaFX
  9. Java:Speedment 3.2的发布–现在启用轻量级数据库微服务
  10. apache hadoop_通过Apache Hadoop大规模扩展Apache Solr实时实时索引