junit:junit_处理JUnit中异常的另一种方法:catch-exception

junit:junit

JUnit中有许多处理异常的方法 (JUnit中有3种处理异常的方法。选择哪一种? JUnit ExpectedException规则:超越了基础 )。 在这篇文章中,我将介绍建议尝试的catch-exception库。 简而言之, catch-exceptions是一个库,可在一行代码中捕获异常,并使它们可用于进一步分析。

通过Maven安装

为了快速入门,我使用了带有一组测试依赖项( JUnit,Mocito,Hamcrest,AssertJ )的单元测试演示项目,并添加了catch-exceptions

<dependency><groupId>com.googlecode.catch-exception</groupId><artifactId>catch-exception</artifactId><version>1.2.0</version><scope>test</scope>
</dependency>

因此,依赖关系树如下所示:

[INFO] --- maven-dependency-plugin:2.1:tree @ unit-testing-demo ---
[INFO] com.github.kolorobot:unit-testing-demo:jar:1.0.0-SNAPSHOT
[INFO] +- org.slf4j:slf4j-api:jar:1.5.10:compile
[INFO] +- org.slf4j:jcl-over-slf4j:jar:1.5.10:runtime
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.5.10:runtime
[INFO] +- log4j:log4j:jar:1.2.15:runtime
[INFO] +- junit:junit:jar:4.11:test
[INFO] +- org.mockito:mockito-core:jar:1.9.5:test
[INFO] +- org.assertj:assertj-core:jar:1.5.0:test
[INFO] +- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.hamcrest:hamcrest-library:jar:1.3:test
[INFO] +- org.objenesis:objenesis:jar:1.3:test
[INFO] \- com.googlecode.catch-exception:catch-exception:jar:1.2.0:test

入门

被测系统(SUT):

class ExceptionThrower {void someMethod() {throw new RuntimeException("Runtime exception occurred");}void someOtherMethod() {throw new RuntimeException("Runtime exception occurred",new IllegalStateException("Illegal state"));}void yetAnotherMethod(int code) {throw new CustomException(code);}
}

带有AssertJ断言的基本catch-exception BDD样式方法示例:

import org.junit.Test;import static com.googlecode.catchexception.CatchException.*;
import static com.googlecode.catchexception.apis.CatchExceptionAssertJ.*;public class CatchExceptionsTest {@Testpublic void verifiesTypeAndMessage() {when(new SomeClass()).someMethod();then(caughtException()).isInstanceOf(RuntimeException.class).hasMessage("Runtime exception occurred").hasMessageStartingWith("Runtime").hasMessageEndingWith("occured").hasMessageContaining("exception").hasNoCause();               }
}

看起来挺好的。 简洁,可读。 没有JUnit运行者。 请注意,我指定了我希望引发异常的SomeClass方法。 可以想象,我可以在一个测试中检查多个异常。 尽管我不推荐这种方法,因为这可能违反了测试的单一责任。

顺便说一句,如果您正在使用Eclipse,这可能对您来说很方便: 在Eclipse中创建JUnit测试时,改进具有静态成员类型的内容辅助

查明原因

我认为以下代码无需评论:

import org.junit.Test;import static com.googlecode.catchexception.CatchException.*;
import static com.googlecode.catchexception.apis.CatchExceptionAssertJ.*;public class CatchExceptionsTest {@Testpublic void verifiesCauseType() {when(new ExceptionThrower()).someOtherMethod();then(caughtException()).isInstanceOf(RuntimeException.class).hasMessage("Runtime exception occurred").hasCauseExactlyInstanceOf(IllegalStateException.class).hasRootCauseExactlyInstanceOf(IllegalStateException.class);}
}

验证Hamcrest的自定义例外

为了验证我用我以前的Hamcrest匹配代码自定义异常后 :

class CustomException extends RuntimeException {private final int code;public CustomException(int code) {this.code = code;}public int getCode() {return code;}
}class ExceptionCodeMatches extends TypeSafeMatcher<CustomException> {private int expectedCode;public ExceptionCodeMatches(int expectedCode) {this.expectedCode = expectedCode;}@Overrideprotected boolean matchesSafely(CustomException item) {return item.getCode() == expectedCode;}@Overridepublic void describeTo(Description description) {description.appendText("expects code ").appendValue(expectedCode);}@Overrideprotected void describeMismatchSafely(CustomException item, Description mismatchDescription) {mismatchDescription.appendText("was ").appendValue(item.getCode());}
}

和测试:

import org.junit.Test;import static com.googlecode.catchexception.CatchException.*;
import static org.junit.Assert.*;public class CatchExceptionsTest {@Testpublic void verifiesCustomException() {catchException(new ExceptionThrower(), CustomException.class).yetAnotherMethod(500);assertThat((CustomException) caughtException(), new ExceptionCodeMatcher(500));}
}

摘要

捕获异常看起来真的很好。 快速入门很容易。 我看到了一些优于JUnit方法规则的优点。 如果有机会,我将更彻底地调查图书馆,希望在一个实际项目中进行。

  • 可以在这里找到本文的源代码: 单元测试演示

如果您有兴趣,请查看我的其他帖子:

  • 在JUnit中处理异常的3种方式。 选择哪一个?
  • JUnit ExpectedException规则:超越基础
  • 如何:在Maven项目(JUnit,Mocito,Hamcrest,AssertJ)中测试依赖项
  • 在Eclipse中创建JUnit测试时,改进具有静态成员类型的内容辅助

翻译自: https://www.javacodegeeks.com/2014/04/yet-another-way-to-handle-exceptions-in-junit-catch-exception.html

junit:junit

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

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

相关文章

LoRa和NB-IoT会长期共存吗?

物联网有很多无线通信技术&#xff0c;主要是Zigbee&#xff0c;WiFi&#xff0c;蓝牙和Z-wave等短距离通信技术&#xff0c;另一种是LPWAN。LPWAN的两种类型之一在未授权的频谱上工作。另一种是2G/3G/4G蜂窝通信技术&#xff0c;该技术在获得行政许可的频谱下工作&#xff0c;…

PoE供电交换机的五大优势详解

众所周知&#xff0c;电气设备只有通电后才能工作&#xff0c;而一些基于IP网络的各种设备也同样需要供电才能使用&#xff0c;比如说路由器、摄像头等&#xff0c;当然啦&#xff0c;自从有了PoE供电技术后&#xff0c;IP网络设备就又多了一种供电方式。POE在为一些基于IP的终…

Java是发展的垫脚石。 学习吧!

Java是世界上最常用的编程语言之一 。 尽管也有许多其他的编程语言&#xff0c;但是没有什么能比Java强。 Java是用于开发移动应用程序&#xff0c;游戏&#xff0c;Web应用程序&#xff0c;桌面应用程序和许多其他令人兴奋的事物的出色语言之一。 而且&#xff0c;事实证明&a…

蓝牙、WiFi、ZigBee三大无线通信技术协议模块哪一个是最好的?

曾经&#xff0c;在2015年极客公园创新大会上&#xff0c;小米首次在非官方平台发布了新款产品小米智能家庭套装。自此&#xff0c;Zigbee便常出现在大众视野中。 如今&#xff0c;小米在IoT物联网应用开发者平台上明确说明&#xff0c;不再推广Zigbee的接入方案。 有人猜测&…

[渝粤教育] 山东大学 大学物理 参考 资料

教育 -大学物理-电磁学和光学-章节资料考试资料-山东大学【】 1.1 电荷和库仑定律 随堂测试 1、【多选题】下面的说法正确的是&#xff08; &#xff09; A、电荷是相对论不变量 B、电荷是量子化的 C、库仑力满足线性叠加原理&#xff0c;第三者的存在会改变两者之间的相互作用…

大功率超远距离lora无线数传电台,多级中继功能

一、在无线通信领域&#xff0c;LoRa是目前市场最被看好的技术之一。随着新一代LoRa调制技术的升级&#xff0c;市场对LoRa技术的认知、认可逐步提高&#xff0c;基于LoRa调制技术开发的产品得到更广泛的应用。受益于其超低的接收灵敏度和独特的调制方式&#xff0c;带来了超远…

POE交换机和普通交换机的区别介绍

POE交换机与普通交换机区别的话&#xff0c;POE交换机就是除了能提供普通交换机所具有的传输功能&#xff0c;还能给网线的另一端设备提供供电功能。普通的交换机主要是交换数据的功能&#xff0c;并没有具备供电的功能。接下来我们就一起来详细看看POE交换机和普通交换机的区别…

Lora无线传输技术与Lorawan无线模块的区别

有不少人分不清LoRaWAN无线模块与LoRa网关无线传输技术到底有什么区别&#xff0c;他们在物联网领域的应用到底是什么样的。 LoRaWAN指的是MAC层的组网协议&#xff0c;而LoRa是一个物理层的协议。虽然现有的LoRaWAN组网基本上都使用LoRa作为物理层&#xff0c;但是LoRaWAN的协…

飞畅科技 POE供电交换机常见问题详解

POE交换机通过网线供电的方式为标准的POE终端设备供电&#xff0c;可以免去额外的电源布线&#xff0c;在为一些基于IP的终端&#xff08;如IP电话机、无线局域网接入点AP、网络摄像机等&#xff09;传输数据信号的同时&#xff0c;还能为此类设备提供直流供电的技术。POE技术能…

[渝粤教育] 上海交通大学 制造工艺基础 参考 资料

教育 -制造工艺基础-章节资料考试资料-上海交通大学【】 第一章 机械制造系统与制造技术的发展 单元测验 1、【单选题】制造系统功能结构不仅应看到物质的流动过程&#xff0c;更应注重控制物流的&#xff08; &#xff09;。 A、能量流 B、信息流 C、物资流 D、电流 参考资料【…

【物联网串口服务器通信经验教程】Modbus网关协议转换

在前面的文章中&#xff0c;我们已经详细地介绍了Modbus网关的几种主要类型&#xff0c;今天&#xff0c;就让我们来介绍一下其中简单协议转换的处理过程。 简单协议转换是最常规、最普遍的Modbus网关功能&#xff0c;也是数据处理效率最高Modbus网关模式&#xff0c;它只是提…

配置hibernate_测试Hibernate的最低配置

配置hibernate介绍 在上一篇文章中&#xff0c;我宣布了我打算创建个人Hibernate课程的意图。 首先要做的是最小的测试配置。 这些示例与Hibernate 4有关。 您只需要Hibernate 在实际的生产环境中&#xff0c;您不会单独使用Hibernate&#xff0c;因为您可以将其集成到JEE或Sp…

[渝粤教育] 上海交通大学 微生物的世界 参考 资料

教育 -微生物的世界-章节资料考试资料-上海交通大学【】 第1章客观题测试 1、【单选题】大肠杆菌的直径大约是&#xff1a; A、0.5-1 纳米 B、0.5-1 微米 C、0.5-1 毫米 D、0.5-1 微纳米 参考资料【 】 2、【单选题】微生物的定义中&#xff0c;以下哪个最准确? A、微生物就是…

一文看懂串口服务器多主机网关工作模式

多主机网关仅能工作在TCP服务器模式下&#xff0c;可同时处理多台Modbus TCP的主机请求&#xff0c;串口服务器在一个主机请求未完成时又收到了其他的主机请求此时串口服务器会在RS485总线上进行仲裁输出&#xff08;通俗地讲就是对后来的指令进行阻塞&#xff09;。 仿真软件演…

程控交换机管理与维护注意事项详解

程控交换机&#xff0c;通常专指用于电话交换网的交换设备&#xff0c;它以计算机程序控制电话的接续&#xff0c;是利用现代计算机技术&#xff0c;完成控制、接续等工作的电话交换机。那么&#xff0c;程控交换机管理与维护中有哪些事项需要注意呢&#xff1f;接下来我们就一…

[渝粤教育] 上海交通大学 理论力学 参考 资料

教育 -理论力学-章节资料考试资料-上海交通大学【】 数学基础 1、【单选题】 A、 B、 C、 D、 参考资料【 】 2、【单选题】<img src"http://edu-image.nosdn.127.net/916C09E309887D88B0901AE96FA571C3.jpg?imageView A、 B、‍ C、 D、‍ 参考资料【 】 3、【单选题…

传感器基于无线通信的远程管理方案

近20年&#xff0c;是房地产行业高速发展的20年&#xff0c;从前期的7层小楼到现在的百米高楼&#xff0c;要问贡献最大的是什么&#xff0c;那一定非塔吊莫属。 万丈高楼平地起&#xff0c;一沙一石都依靠塔吊强大的垂直运送能力运送到高层。但是&#xff0c;塔吊高效的同时&…

使用Spring Security 5进行密码编码器迁移

最近&#xff0c;我在一个使用自定义PasswordEncoder的项目中工作&#xff0c;需要将其迁移到bcrypt 。 当前的密码存储为hash &#xff0c;这意味着不可能将其还原为原始的String –至少不是简单的方法。 这里的挑战是如何支持两种实现&#xff0c;旧的哈希解决方案以及新的b…

[渝粤教育] 上海师范大学 家庭教育SPOC二班 参考 资料

教育 -家庭教育SPOC二班-章节资料考试资料-上海师范大学【】 请您阅读一本或几本家庭教育的相关书籍&#xff08;可参考推荐书目&#xff09;&#xff0c;并完成一篇不少于800字的读后感。推荐书目如下&#xff1a;《父母的语言》、《亲密关系》、《正面管教》、《母爱的羁绊》…

zigbee技术数传电台在石油探井状态监测系统

石油探井分布分散&#xff0c;数量众多&#xff0c;出现异常现象需及时处理。人工巡视耗时长、时效性差&#xff1b;有线传输存在布线繁琐、成本高、现场无移动网络覆盖等诸多缺点。 现需要一种支持大量接入、覆盖范围广、数据传输高效且有数据中心可以汇总数据的无线传输技术…