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

java junit 异常

在JUnit中,有许多方法可以在测试代码中测试异常,包括try-catch idiom JUnit @Rulecatch-exception库。 从Java 8开始,我们还有另一种处理异常的方法:使用lambda表达式。 在这篇简短的博客文章中,我将演示一个简单的示例,说明如何利用Java 8和lambda表达式的功能来测试JUnit中的异常。

注意:撰写此博客文章的动机是在catch-exception项目页面上发布的消息:



Java 8的lambda表达式将使catch-exception冗余。 因此,该项目将不再维护

SUT –被测系统

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

第一个:

class DummyService {public void someMethod() {throw new RuntimeException("Runtime exception occurred");}public void someOtherMethod() {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");}
}

所需语法

我的目标是实现与catch-exception库接近的语法:

package com.github.kolorobot.exceptions.java8;import org.junit.Test;
import static com.github.kolorobot.exceptions.java8.ThrowableAssertion.assertThrown;public class Java8ExceptionsTest {@Testpublic void verifiesTypeAndMessage() {assertThrown(new DummyService()::someMethod) // method reference// assertions.isInstanceOf(RuntimeException.class).hasMessage("Runtime exception occurred").hasNoCause();}@Testpublic void verifiesCauseType() {assertThrown(() -> new DummyService().someOtherMethod(true)) // lambda expression// assertions.isInstanceOf(RuntimeException.class).hasMessage("Runtime exception occurred").hasCauseInstanceOf(IllegalStateException.class);}@Testpublic void verifiesCheckedExceptionThrownByDefaultConstructor() {assertThrown(DummyService2::new) // constructor reference// assertions.isInstanceOf(Exception.class).hasMessage("Constructor exception occurred");}@Testpublic void verifiesCheckedExceptionThrownConstructor() {assertThrown(() -> new DummyService2(true)) // lambda expression// assertions.isInstanceOf(Exception.class).hasMessage("Constructor exception occurred");}@Test(expected = ExceptionNotThrownAssertionError.class) // making test passpublic void failsWhenNoExceptionIsThrown() {// expected exception not thrownassertThrown(() -> System.out.println());}
}

注意:与catch-exception相比的优势在于,我们将能够测试引发异常的构造函数。

创建“图书馆”

合成糖

assertThrown是一个静态工厂方法,它创建一个ThrowableAssertion的新实例,并引用了捕获的异常。

package com.github.kolorobot.exceptions.java8;public class ThrowableAssertion {public static ThrowableAssertion assertThrown(ExceptionThrower exceptionThrower) {try {exceptionThrower.throwException();} catch (Throwable caught) {return new ThrowableAssertion(caught);}throw new ExceptionNotThrownAssertionError();}// other methods omitted for now
}

ExceptionThrower@FunctionalInterface ,可以使用lambda表达式,方法引用或构造函数引用创建实例。 assertThrown接受ExceptionThrower将期望并准备处理异常。

@FunctionalInterface
public interface ExceptionThrower {void throwException() throws Throwable;
}

断言

最后,我们需要创建一些断言,以便可以在测试代码中验证有关teste异常的解释。 实际上, ThrowableAssertion是一种自定义断言,为我们提供了一种有效地验证所捕获异常的方法。 在下面的代码中,我使用了Hamcrest匹配器来创建断言。 ThrowableAssertion类的完整来源:

package com.github.kolorobot.exceptions.java8;import org.hamcrest.Matchers;
import org.junit.Assert;public class ThrowableAssertion {public static ThrowableAssertion assertThrown(ExceptionThrower exceptionThrower) {try {exceptionThrower.throwException();} catch (Throwable caught) {return new ThrowableAssertion(caught);}throw new ExceptionNotThrownAssertionError();}private final Throwable caught;public ThrowableAssertion(Throwable caught) {this.caught = caught;}public ThrowableAssertion isInstanceOf(Class<? extends Throwable> exceptionClass) {Assert.assertThat(caught, Matchers.isA((Class<Throwable>) exceptionClass));return this;}public ThrowableAssertion hasMessage(String expectedMessage) {Assert.assertThat(caught.getMessage(), Matchers.equalTo(expectedMessage));return this;}public ThrowableAssertion hasNoCause() {Assert.assertThat(caught.getCause(), Matchers.nullValue());return this;}public ThrowableAssertion hasCauseInstanceOf(Class<? extends Throwable> exceptionClass) {Assert.assertThat(caught.getCause(), Matchers.notNullValue());Assert.assertThat(caught.getCause(), Matchers.isA((Class<Throwable>) exceptionClass));return this;}
}

AssertJ实施

如果您使用AssertJ库,则可以利用org.assertj.core.api.ThrowableAssert轻松创建ThrowableAssertion AssertJ版本,它提供了许多org.assertj.core.api.ThrowableAssert断言。 该类的实现比上面介绍的Hamcrest更简单。

package com.github.kolorobot.exceptions.java8;import org.assertj.core.api.Assertions;
import org.assertj.core.api.ThrowableAssert;public class AssertJThrowableAssert {public static ThrowableAssert assertThrown(ExceptionThrower exceptionThrower) {try {exceptionThrower.throwException();} catch (Throwable throwable) {return Assertions.assertThat(throwable);}throw new ExceptionNotThrownAssertionError();}
}

AssertJ的示例测试:

public class AssertJJava8ExceptionsTest {@Testpublic void verifiesTypeAndMessage() {assertThrown(new DummyService()::someMethod).isInstanceOf(RuntimeException.class).hasMessage("Runtime exception occurred").hasMessageStartingWith("Runtime").hasMessageEndingWith("occurred").hasMessageContaining("exception").hasNoCause();}
}

摘要

仅用几行代码,我们构建了非常酷的代码,可帮助我们在JUnit中测试异常而无需任何其他库。 这仅仅是一个开始。 利用Java 8和lambda表达式的强大功能!

资源资源

  • GitHub上提供了本文的源代码 (请看com.github.kolorobot.exceptions.java8包)
  • 我的其他一些文章关于在JUnit中测试异常。 请看一看:
    • 定制断言

翻译自: https://www.javacodegeeks.com/2014/07/junit-testing-exception-with-java-8-and-lambda-expressions.html

java junit 异常

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

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

相关文章

mysql排插问题_MySQL一次数据插入故障记录

某天突然收到报警&#xff0c;数据库大量事务等待&#xff0c;进到数据库后发线大量的插入操作被阻塞&#xff0c;且都是同一个表的。通过 show engine innodb status 发现插入操作都是在等待索引 idx_create_time(create_time) 的 insert intention lock(跟 gap 锁互斥)&#…

python getopt.getopt_python 参数格式化getopt

命令行参数格式化需要python getopt模块&#xff1a;1.python 命令行参数格式化写道try:options,args getopt.getopt(sys.argv[1:],"hp:i:",["help","ip","port"])except getopt.GetoptError:sys.exit()for name,value in options:i…

使用Zuul和Spring Boot创建API网关

介绍 使用微服务时&#xff0c;通常具有对系统的统一访问点&#xff08;也称为API Gateway &#xff09;。 消费者仅与API网关交谈&#xff0c;而不与服务直接交谈。 这掩盖了您的系统由多个较小的服务组成的事实。 API网关还可帮助解决常见的挑战&#xff0c;例如身份验证&…

纯净pe工具_微PE工具箱2.0

(特殊时期&#xff0c;在家时间多一些&#xff0c;突然想到多年的公众号&#xff0c;重启试试&#xff0c;嗯就先每一天推荐一个软件吧)微PE工具箱(WinPE)是一款非常好用的PE系统(独立的预安装环境)&#xff0c;非常纯净&#xff0c;是装机维护得力的助手。安装简单&#xff0c…

sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例

文本将对在spring Boot构建的Web应用中&#xff0c;基于MySQL数据库的几种数据库连接方式进行介绍。包括JDBC、JPA、MyBatis、多数据源和事务。JDBC 连接数据库1、属性配置文件(application.properties)spring.datasource.urljdbc:mysql://localhost:3306/testspring.datasourc…

二分查找递归与非递归的时间比较_我们说一说Python的查找算法!

相信大家在面试开发岗和算法岗时&#xff0c;评委最喜欢问的就是&#xff1a;您能给我说一下查找和排序算法有哪些&#xff1f;今天咱们就说一说Python中最常用的查找算法&#xff0c;下期我们再推出排序算法。首先要明白查找是查什么&#xff1f;我们希望能给定一个值&#xf…

ambari mysql error code: 1665_ambari安装中常见的问题

1.openssl版本问题错误如下&#xff1a;ERROR 2018-09-11 14:51:40,101 NetUtil.py:96 - EOF occurred in violation of protocol (_ssl.c:579)ERROR 2018-09-11 14:51:40,101 NetUtil.py:97 - SSLError: Failed to connect. Please check openssl library versions.解决方法&a…

jsf 自定义属性_如何在JSF中实现自定义密码强度指示器

jsf 自定义属性使用JavaScript验证密码强度是一项常见任务。 在本文中&#xff0c;我将展示如何向基于JSF的Web应用程序添加密码强度指示器。 的 PrimeFaces中的密码组件已经具有密码强度的反馈指示符&#xff0c;但是它有两个主要缺点&#xff1a; 反馈指示器没有响应&#…

python编写代码时零_python – KeyError:运行打包代码时为0L

我有一个名为rra.py的脚本,它具有以下skelton结构&#xff1a;usn""usnl[]from bs4 import BeautifulSoupimport reimport asysimport globimport osimport sysimport sysdef inputIndex():#some processsingdef getval():#some processingdef parsehtml():#some pro…

python读取sqlserver的数据_Python:使用并发未来进程P读取sqlserver数据

我是一个从未使用过任何并行处理方法的新手。我希望从SQL Server读取大量数据(即至少200万行)&#xff0c;并希望使用并行处理来加快读取速度。下面是我使用并发未来进程池进行并行处理的尝试。在class DatabaseWorker(object):def __init__(self, connection_string, n, resul…

OAuth 2.0 Java指南:5分钟保护您的应用程序安全

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 现代应用程序依赖于用户身份验证&#xff0c;但是它可能给Java开发人员带来困难的挑战&#xff0c;以及一系列特定于框…

flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

作者&#xff1a;SHERlocked93转发链接&#xff1a;https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q前言相比于早些年前后端代码紧密耦合、后端工程师还得写前端代码的时代&#xff0c;如今已发展到前后端分离&#xff0c;这种开发方式大大提升了前后端项目的可维护性与开发…

java 查找排序_Java类库中的一些常用的查找排序

查找是一种试图在数据集或者数组中发现某一目标值的操作排序是使列表中的元素按照自然顺序进行排序的一种操作Java的类库中包含来一些可以实现对数组或者列表实现查找和排序的方法。例如&#xff1a;Arrays.binarySearch和Collections.sort一个比较器对象可以用来定义对对象进行…

python保存所有变量值_如何在当前python会话中保存所有变量?

繁星coding这是使用spyderlib函数保存Spyder工作区变量的方法#%% Load data from .spydata filefrom spyderlib.utils.iofuncs import load_dictionaryglobals().update(load_dictionary(fpath)[0])data load_dictionary(fpath)#%% Save data to .spydata filefrom spyderlib…

java jtextarea 滚动条_java 在JTextArea中显示 滚动条

我的代码为什么不显示垂直滚动条是那里错了么如果有错求高手修改importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.util.*;publicclassCai{privateJFrame_fra...我的代码为什么不显示垂直滚动条 是那里错了么 如果有错 求高手修改import javax.swing.*…

zipkin 自定义采样率_分组,采样和批处理– Java 8中的自定义收集器

zipkin 自定义采样率在第一篇文章的后续部分&#xff0c;这一次我们将编写一些更有用的自定义收集器&#xff1a;用于按给定的标准进行分组&#xff0c;采样输入&#xff0c;批量处理以及在固定大小的窗口上滑动。 分组&#xff08;计数事件&#xff0c;直方图&#xff09; 假…

linux python版本升级和系统更新_Linux 下升级python和安装pip

1、 首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致3、 解压tar -zxvf Python-2.7.11.tgz进入Python-2.7.11目录 输入./configuremakemake install4、 此时查看python版本还是系统默认的版本执行&#xff1a;mv /usr/bin/python /usr/bin/python2.6ln…

成为Java流大师–第1部分:创建流

在许多情况下&#xff0c;声明性代码&#xff08;例如&#xff0c;具有Streams的功能组合&#xff09;可提供出色的代码指标。 通过本动手实验文章系列进行编码&#xff0c;并成为Java Streams的主教练&#xff0c;从而成为一名更好的Java程序员。 Streams的整个想法是代表一个…

python做一副54扑克牌发牌技巧_德州扑克讲堂:高级技巧 胜率之摊牌胜率的算法...

行动胜率的算法。行动获胜是德州扑克中唯二的获胜方式&#xff0c;掌握了对手的弃牌率的话&#xff0c;就算手里完全没牌也可以轻松获胜。然而具体打出对手稳定的弃牌则是一种高级技巧。对于初学玩家&#xff0c;推荐掌握好摊牌胜率的算法&#xff0c;稳当地用摊牌来获胜。胜率…

java 6 基础教程_Java小白入门教程(6)——循环语句

提纲&#xff1a;1、循环结构2、while循环3、do-while循环4、for循环5、break语句6、continue语句7、循环嵌套8、作业一、循环结构1.1 概念条件满足&#xff0c;某些代码会被反复多次的执行。条件不成立了&#xff0c;循环结束。0-n次。1.2 为什么使用循环开发中可能会把某些代…