junit:junit_JUnit ExpectedException规则:超越基础

junit:junit

JUnit测试中有多种处理异常的方法。 正如我在以前的一篇文章中所写的那样 ,我最好的方法是使用org.junit.rules.ExpectedException规则。 基本上,规则是对org.junit.Beforeorg.junit.Afterorg.junit.BeforeClassorg.junit.AfterClass注释的方法的替代(或补充),但它们功能更强大,并且功能更多。在项目和课程之间轻松共享。 在本文中,我将展示org.junit.rules.ExpectedException规则的更高级用法。

验证异常消息

标准JUnit的org.junit.Test批注提供了expected属性,该属性允许您指定Throwable以在测试方法抛出指定类的异常时导致测试方法成功。 在许多情况下,这似乎足够了,但是如果您要验证异常消息,则必须找到其他方法。 使用ExpectedException非常简单:

public class ExpectedExceptionsTest {@Rulepublic ExpectedException thrown = ExpectedException.none();@Testpublic void verifiesTypeAndMessage() {thrown.expect(RuntimeException.class);thrown.expectMessage("Runtime exception occurred");throw new RuntimeException("Runtime exception occurred");}
}

在上面的代码片段中,我们希望消息contains给定的子字符串。 仅与类型检查相比,它更安全。 为什么? 假设我们有一个ExceptionThrower ,如下所示:

class ExceptionsThrower {void throwRuntimeException(int i) {if (i <= 0) {throw new RuntimeException("Illegal argument: i must be <= 0");}throw new RuntimeException("Runtime exception occurred");}
}

如您所见,方法抛出的两个异常都是RuntimeException ,因此,如果我们不检查消息,则不能100%确定方法会抛出哪个异常。 以下测试将通过:

@Test
public void runtimeExceptionOccurs() {thrown.expect(RuntimeException.class);// opposite to expectedexceptionsThrower.throwRuntimeException(0);
}@Test
public void illegalArgumentExceptionOccurs() {thrown.expect(RuntimeException.class);// opposite to expectedexceptionsThrower.throwRuntimeException(1);
}

检查异常中的消息将解决问题,并确保您正在验证所需的异常。 与@Test注释方法的expected属性相比,这已经是一个优势。

但是,如果您需要以更复杂的方式验证异常消息怎么办? ExpectedException通过提供Hamcrest匹配器为expectMessage方法(而不是字符串)允许您这样做。 让我们看下面的例子:

@Test
public void verifiesMessageStartsWith() {thrown.expect(RuntimeException.class);thrown.expectMessage(startsWith("Illegal argument:"));throw new RuntimeException("Illegal argument: i must be <= 0");
}

如您所料,您可以提供自己的匹配器以验证消息。 让我们来看一个例子。

@Test
public void verifiesMessageMatchesPattern() {thrown.expect(RuntimeException.class);thrown.expectMessage(new MatchesPattern("[Ii]llegal .*"));throw new RuntimeException("Illegal argument: i must be <= 0");
}class MatchesPattern extends TypeSafeMatcher<String> {private String pattern;public MatchesPattern(String pattern) {this.pattern = pattern;}@Overrideprotected boolean matchesSafely(String item) {return item.matches(pattern);}@Overridepublic void describeTo(Description description) {description.appendText("matches pattern ").appendValue(pattern);}@Overrideprotected void describeMismatchSafely(String item, Description mismatchDescription) {mismatchDescription.appendText("does not match");}
}

验证异常对象

在某些情况下,匹配消息可能还不够。 自定义方法可能会有例外,您也想对其进行验证。 没问题 ExpectedException允许以expect方法,它匹配。

@Test
public void verifiesCustomException() {thrown.expect(RuntimeException.class);thrown.expect(new ExceptionCodeMatches(1));throw new CustomException(1);
}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 code;public ExceptionCodeMatches(int code) {this.code = code;}@Overrideprotected boolean matchesSafely(CustomException item) {return item.getCode() == code;}@Overridepublic void describeTo(Description description) {description.appendText("expects code ").appendValue(code);}@Overrideprotected void describeMismatchSafely(CustomException item, Description mismatchDescription) {mismatchDescription.appendText("was ").appendValue(item.getCode());}
}

请注意,我同时实现了TypeSafeMatcher describeTodescribeMismatchSafely方法。 当测试失败时,我需要它们产生看起来很漂亮的错误消息。 看下面的例子:

java.lang.AssertionError: 
Expected: (an instance of java.lang.RuntimeException and expects code <1>)but: expects code <1> was <2>

检查原因

您可以使用ExpectedException做的另一件事是验证引发异常的原因。 这也可以使用自定义匹配器完成:

@Test
public void verifiesCauseTypeAndAMessage() {thrown.expect(RuntimeException.class);thrown.expectCause(new CauseMatcher(IllegalStateException.class, "Illegal state"));throw new RuntimeException("Runtime exception occurred",new IllegalStateException("Illegal state"));
}private static class CauseMatcher extends TypeSafeMatcher<Throwable> {private final Class<? extends Throwable> type;private final String expectedMessage;public CauseMatcher(Class<? extends Throwable> type, String expectedMessage) {this.type = type;this.expectedMessage = expectedMessage;}@Overrideprotected boolean matchesSafely(Throwable item) {return item.getClass().isAssignableFrom(type)&& item.getMessage().contains(expectedMessage);}@Overridepublic void describeTo(Description description) {description.appendText("expects type ").appendValue(type).appendText(" and a message ").appendValue(expectedMessage);}
}

摘要

ExpectedException规则是一个强大的功能。 通过添加Hamcrest匹配器,您可以轻松地为异常测试创建健壮且可重用的代码。

  • 可以在GitHub上找到代码示例。 还请检查我以前的文章: JUnit中处理异常的3种方法。 选择哪一个?

参考: JUnit ExpectedException规则: Codeleak.pl博客上的JCG合作伙伴 Rafal Borowiec的基本知识 除外 。

翻译自: https://www.javacodegeeks.com/2014/03/junit-expectedexception-rule-beyond-basics.html

junit:junit

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

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

相关文章

什么是工业光纤收发器,工业收发器的作用是什么?

工业收发器是发射器和接收器的组合&#xff0c;两者共享公共电路。通常&#xff0c;收发器用于无线通信系统中。从历史上看&#xff0c;收发器用于将计算机连接到外围设备&#xff0c;例如打印机&#xff0c;键盘&#xff0c;调制解调器&#xff0c;操纵杆和鼠标。当前&#xf…

自动化测试在CI CD管道中的作用

业界广泛采用的软件开发实践&#xff1a;持续集成和持续部署可确保良好地交付产品并经常交付。 常规代码提交需要常规/连续测试&#xff0c;而如果忽略它&#xff0c;则可能导致基础架构无法恢复。 如何交付坚固的CI CD管道&#xff1f; 对于许多公司来说&#xff0c;这是一个问…

VGA光纤收发器特点及参数

VGA光纤收发器采用先进的非压缩数字高清视频和高速数字光纤传输技术&#xff0c;可以轻松地将计算机主机、高清视频信号源、高清DVD/DVR等设备输出的各种分辨率的VGA高清视频信号长距离传输到远端的器件。那么&#xff0c;VGA光纤收发器的特点及技术参数有哪些呢&#xff1f;接…

单模单纤光纤收发器指示灯及故障问题详解

光纤收发器是现在网络传输中应用比较广泛的设备了&#xff0c;其特点是成对使用&#xff0c;体积小&#xff0c;传输距离远&#xff08;25KM&#xff09;。在实际应用中难免会碰到一些故障&#xff0c;现杭州飞畅科技的小编就光纤收发器使用过程中的相关指示灯及故障问题整理如…

POE供电光纤收发器在网络监控中的应用

现如今&#xff0c;随着安防行业的不断发展&#xff0c;在传输信号的过程中对载体提出了更高的要求。光口交换机固然有其成本&#xff0c;市场化程度高等优点&#xff0c;但在网络摄像机越来越多的运用到光纤收发器加光纤交换机的方案。接下来就由飞畅科技的小编来为大家介绍下…

javafx canvas_JavaFX技巧2:使用Canvas API进行清晰绘图

javafx canvas最初开始使用Canvas API时&#xff0c;我注意到渲染代码的结果有些模糊&#xff0c;甚至更糟&#xff0c;不一致。 有些线条模糊&#xff0c;有些线条清晰。 来自Swing&#xff0c;我花了一些时间才意识到这是由JavaFX的坐标系引起的&#xff0c;该坐标系允许双精…

什么是单模光纤收发器,应用范围有哪些?

现在&#xff0c;随着各项网络技术的突飞猛进&#xff0c;在许多网络应用场合都会需要光纤收发器进行远距离的传输&#xff0c;以致于现在国外和国内生产光纤收发器厂商非常多&#xff0c;产品线也极为丰富。在上一篇我们介绍了光纤收发器的分类&#xff0c;今天&#xff0c;就…

Zing加快了JVM应用程序的预热

Java虚拟机&#xff08;JVM&#xff09;提供了托管运行时环境&#xff0c;用于安全部署应用程序&#xff0c;其性能通常可以超过本机编译语言&#xff08;如C和C &#xff09;的性能。 通过即时&#xff08;JIT&#xff09;编译进行垃圾收集和自适应编译的内存管理是两个最突出…

单模光纤收发器产品介绍及常见分类方式

现如今&#xff0c;随着网络技术的进步&#xff0c;许多的场合都会需要光纤收发器进行远距离的传输&#xff0c;以致于现在国外和国内生产光纤收发器厂商非常多&#xff0c;产品线也极为丰富。收发器都是电转光的网络结构。接下来我们就来为大家详细介绍下单模光纤收发器以及光…

多模光纤收发器的基本参数及主要特点

多模光纤收发器具备地址过滤、网络分段及智能报警等功能&#xff0c;可提高网络工作效率及网络运行可靠性。飞畅科技10/100M双芯多模自适应以太网光纤收发器&#xff0c;采用最新美国KENDIN芯片&#xff0c;高品质光收发一体模块&#xff0c;性能稳定&#xff0c;质量优良。适用…

没有垃圾回收的JVM

JVM社区不断增加新的GC&#xff0c;最近又添加了一个新的GC&#xff0c;它称为Epsilon &#xff0c;是非常特殊的一个。 Epsilon仅分配内存&#xff0c;但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途&#xff0c;我们将…

多模光纤收发器的应用领域及适用领域

双纤多模高性能10/100Mbit自适应光纤收发器&#xff08;光电转换器&#xff09;&#xff0c;具备地址过滤、网络分段及智能报警等功能&#xff0c;可提高网络工作效率及网络运行可靠性。可实现最远5公里无中继计算机数据网的高速远程互连。产品性能稳定可靠&#xff0c;设计方面…

java开发人员_每个Java开发人员都应该阅读的10本书

java开发人员我已经阅读了自己的软件开发书籍&#xff0c;并且发现发现一本我想多次阅读的书籍非常罕见。 但是&#xff0c;有时我会发现一本书&#xff0c;每次阅读时都会教给我新的东西。 这篇博客文章是对这些稀有宝石的致敬。 现在&#xff0c;我毫不犹豫地向您介绍了十本…

光电转换器有什么用 光电转换器的作用

现如今&#xff0c;网络已经是我们生活中所必不可缺的一部分了&#xff0c;我们一旦离开了网络就仿佛与世界脱轨&#xff0c;所以说网络现在在我们的生活中扮演者一个非常重要的角色。在这其中光电转换器是一种不可缺少的设备&#xff0c;它将我们要发送的电信号转换成光信号&a…

光模块和光纤收发器的区别是什么?

是什么光纤由其传输速度快、距离远和安全稳定、抗干扰能力强等优势成为人们在通信敷设时的首先。当下很多智慧工程中使用到的远距离数据传输基本都采用光纤传输。而这之间的连接则需要光模块和光纤收发器来实现。很多用户对光模块和光纤收发器的使用有些疑惑&#xff0c;这两者…

Java中的命令设计模式

在本教程中&#xff0c;我们将学习命令模式&#xff0c;这是一种重要的行为设计模式。 它具有一些重要的应用程序&#xff0c;例如在文本编辑器中实现撤消/重做功能。 在命令设计模式中&#xff0c;有一个命令对象位于发送方和接收方对象之间。 发送者对象可以创建命令对象。 …

光纤收发器怎么连接?

我们想要上网&#xff0c;就必须连接网络&#xff0c;而日常生活当中我们最常使用的网络就是宽带&#xff0c;连接宽带需要通过网线进行连接&#xff0c;但是网线在传输数据时它有一定的局限性&#xff0c;它的传输距离很小&#xff0c;一般情况下网线的传输距离仅仅只有100米&…

光纤收发器常见故障及解决方法

光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中&#xff0c;通常定位于宽带城域网的接入层应用&#xff0c;在各种监控安全工程中应用非常的广泛。但是我们在使用光纤收发器的过程中难免会碰到一些故障问题&#xff0c;那么我们在遇到问…

oracle jdk8收费_JDK 8中的Oracle Drops Collection文字

oracle jdk8收费在OpenJDK JEP 186上的一个帖子中&#xff0c;Oracle的Brian Goetz通知Oracle在JDK8中不会将集合文字用作语言功能。 集合文字是一种语法表达形式&#xff0c;其求值形式为数组&#xff0c;列表或映射的聚合类型。 Project Coin提出了集合文字&#xff0c;这也…

光纤收发器常见六大故障,三分钟全部搞定

光纤收发器&#xff0c;是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元&#xff0c;在很多地方也被称之为光电转换器。光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中&#xff0c;如&#xff1a;监控安…