JUnit 4.9(测试版3)中的规则

不久前, David Saff宣布了JUnit 4.9的beta版 。 因此,我认为现在是研究该版本中的新增功能的好时机。

JUnit领域中最有用的创新之一是Rule。 我在这里写了有关规则的文章 。 我在这里写了有关JUnit规则的用例 。 规则很棒。 借助JUnit 4.9,它们变得更好。

您可以将规则视为将测试的设置和拆卸封装在一个类中而不是两个方法中的一种方法。 但是规则也是一种修改执行测试方式的方法。 您可以多次运行测试,而不是一次。 或在二十个不同的线程中。 有趣的是,只有单个测试规则。 因此,如果您要坚持进行设置和拆卸的比较, 那么@Before@After则在Rule中没有等效的@BeforeClass@AfterClass

现在情况已经改变。 现在,您可以标注类型TestRule的公共静态字段与@ClassRule,它会表现就像是一整个测试类,而不是一个单一的测试定义的规则。 因此,对于需要为所有测试设置一次而不是为每个测试设置一次的东西而言,它是完美的选择。 让我们来看一个例子。

规则的实现可能如下所示:

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;public class LoggingRule implements TestRule {public class LoggingStatement extends Statement {private final Statement statement;public LoggingStatement(Statement aStatement, String aName) {statement = aStatement;}@Overridepublic void evaluate() throws Throwable {System.out.println("before: " + name);statement.evaluate();System.out.println("after: " + name);}}private final String name;public LoggingRule(String aName) {name = aName;}@Overridepublic Statement apply(Statement statement, Description description) {System.out.println("apply: " + name);return new LoggingStatement(statement, name);}}

大多数实现将由两部分组成: TestRule接口的实现和Statement接口的实现。

TestRule替换了以前不推荐使用的MethodRule接口。 这是因为新接口同时支持类级别和方法级别的Rule,因此必须进行一些更改。 TestRule有一个应用apply方法,该方法接受一条Statement并返回一条Statement 。 在执行Rule范围内的任何测试之前,将调用此方法。 传入的Statement实际上是可能执行的测试。 这里需要注意两件事:如果您的Rule与@ClassRule批注一起使用,则Statement可能并且将代表多个测试; 调用apply并不意味着Statement实际上会被执行。 由于您的规则返回的任何内容都可能传递给其他规则,因此在实际执行所包含的测试之前,可能会以各种方式对语句进行处理。 apply方法中要做的典型事情是将Statement包裹在一个新的Statement中 ,它将执行您所需的逻辑。

Statement接口具有单个方法评估 ,在正常情况下应执行一个测试或一堆测试。 因此,如果采用上述典型方法,则需要包含的Statement 进行一些设置调用评估 ,并进行拆卸。 在上面提供的示例中,我在控制台上打印内容,以便可以看到以什么顺序调用内容。 该语句还传递了一个描述 ,其中包含有关测试的有用的元信息。 它包含名称,定义测试的类,方法名称并提供注释。 因此,您的“规则/声明”可以根据其操作所依据的测试方法来微调其行为。

使用此规则的测试类可能如下所示:

import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;public class RuleTest {@ClassRulepublic static LoggingRule classRule = new LoggingRule("classrule");@Rulepublic static LoggingRule rule = new LoggingRule("rule");@Testpublic void testSomething() {System.out.println("In TestSomething");assertTrue(true);}@Testpublic void testSomethingElse() {System.out.println("In TestSomethingElse");assertTrue(true);}
}

对JUnit4.8规则的唯一更改是@ClassRule批注的存在。 请注意,同一类与@ClassRule@Rule批注一起使用。
执行后,测试类的输出如下所示:

apply: classrule
before: classrule
apply: rule
before: rule
In TestSomething
after: rule
apply: rule
before: rule
In TestSomethingElse
after: rule
after: classrule

如您所见,首先将应用类级别的Rule并评估结果Statement 。 仅作为评估的一部分,才应用方法级别的“规则”并评估结果“ 语句” ,每次测试一次。
提醒您一句:小心在“规则”中使用正确的修饰符。 它们必须是公共的,并且类级别的规则必须是静态的。 取决于您做错了什么(以及您在什么环境中工作),导致的错误可能并不完全有用。 这被认为是一个错误,并且正在修复。

参考:来自Schauderhaft博客的JCG合作伙伴 Jens Schauder的 JUnit 4.9(测试版3)中的规则 。

相关文章 :

  • Java工具:源代码优化和分析
  • 框架使开发人员愚蠢吗?
  • 每个程序员都应该知道的事情
  • JDK中的设计模式
  • Java最佳实践

翻译自: https://www.javacodegeeks.com/2011/09/rules-in-junit-49-beta-3.html

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

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

相关文章

计算机网络-终端

我们常用的电脑来说,外围设备就是终端。 外围设备包括显示器、鼠标、键盘等等。 负责向主机输入数据的就叫输入终端,比如鼠标、键盘、麦克风、摄像头; 负责接收主机输出数据的设备就被称作输出终端,比如显示器、耳机。 注意一点…

为什么我喜欢Java的细节

他们说,Java太冗长了。 您可以找到Hello World程序的比较结果,这些程序在ruby中使用2行,在Java中使用10行,要读取文件,您需要使用Java 20行和php中1行。 尽管示例经常被夸大(例如,计算导入次数&…

dll 源码_【技术分享】 | 一个JAVA内存马的源码分析

前言偶然接触到了这样一个JAVA内存马,其作者也是冰蝎的作者,项目地址:https://github.com/rebeyond/memShell正好最近在接触JAVA,借此机会学习下大佬的代码,对自己的编程思路也有了一定的提升。当然笔者只是一个脚本小…

ThunderSearch(闪电搜索器)_网络空间搜索引擎工具_信息收集

文章目录 ThunderSearch简介1 项目地址2 使用方式2.1 配置文件config.json说明2.2 构建和运行 3 使用式例 ThunderSearch简介 ThunderSearch(闪电搜索器)是一款使用多个(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake网络空间搜索引擎】网络空间搜索引…

字符串匹配方法

介绍两种字符串匹配方法1.暴力匹配母串用s表示,长度为m子串用p表示,长度为n时间复杂度为:(m-n1)n算法:从s串的第一个字符开始匹配,若匹配,继续根据p向后匹配,若后续的不匹配,s右移重新匹配p 2.K…

区分几进制的标志

自己总是记不住进制的开头标记,就写下来忘了就看看 1.二进制:Binary,数字以0b 、0B开头 2.八进制:octal number system,数字自然以0打头 3.十六进制:hexadecimal,以0x、0X开头

每个人都知道MVC…

从一个最近的博客中,您可能已经了解到我最近一直在进行一些采访,因为他们是针对Web应用程序开发人员的,所以我问的一个问题是“您能解释一下MVC模式是什么吗?”,值得称赞的是,每个候选人知道答案。 对于不认…

php无限分类

无限循环 1.需要套2个foreach 2.2个foreach结构一样 纯代码获取数据 public function CycleData($parent_id0){$where[parent_id] $parent_id;$res $this->m->where($where)->field(id,name)->select();foreach($res as $k>$v){$result[$v[id]][id] $v[id];$r…

动态网页数据的采集方案

我在上一篇文章中介绍了使用ScrapySharp快速从网页中采集数据,这种方式是通过直接发送的Http请求来获取的原始页面信息,对于静态网页非常有效,但还有许多网站中的页面内容并非全部存放在原始的页面中,很多内容是通过javascript来动…

r语言ggplot2 多线图绘制图例_plotnine: Python版的ggplot2作图库

腾讯课堂 | Python网络爬虫与文本数据分析同样的基本作图任务,plotnine比matplotlib和seaborn代码量少,更美观。所以我又重新发一遍,大家可以先收藏起来,后面总有用到的时候~R语言的ggplot2绘图能力超强,python虽有mat…

单元和集成测试的代码覆盖率

我最近在一个宠物项目中着手构建自动化的UI(集成)测试以及普通的单元测试。 我想将所有这些集成到我的Maven构建中,并提供代码覆盖率报告,以便我可以了解测试覆盖率不足的区域。 我不仅发布了项目的源代码,还整理了一个…

javascript事件与event对象的属性

javascript事件列表解说事件浏览器支持解说一般事件onclickIE3、N2鼠标点击时触发此事件ondblclickIE4、N4鼠标双击时触发此事件onmousedownIE4、N4按下鼠标时触发此事件onmouseupIE4、N4鼠标按下后松开鼠标时触发此事件onmouseoverIE3、N2当鼠标移动到某对象范围的上方时触发此…

感想

读完三篇文章看到了前辈们的努力与坚持和对各自的学科的热爱,以及各位前辈的奋斗的艰苦环境,我与那些前辈相比也许还达不到前辈们的那种级别,但是我的学习的条件却比那些前辈们好的多,看完前辈们的奋斗史,以及前辈们的…

python学生分布_Python数据分析实战之分布分析

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:严小样儿 分布分析法,一般是根据分析目的,将数据进行分组,研究各组别分布规律的一种分析方法。…

使用Spring Security 3.1保护RESTful Web服务,第3部分

1.概述 本教程显示了如何使用Spring和基于Java的Spring Security 3.1来保护REST服务 。 本文将重点介绍如何使用“登录和Cookie”方法专门针对REST API设置安全配置。 2. Spring Security的体系结构完全基于Servlet过滤器,因此,在HTTP请求处理方面&…

一次完整的HTTP请求所经历的7个步骤

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1、建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共…

jQuery基础--样式篇(3)

1.jQuiery对象与DOM对象   对于刚刚接触jQuery的初学者,我们要清楚认识一点:jQuery对象与DOM对象是不一样的。可能一时半会分不清楚哪些是jQuery对象,哪些是DOM对象,下面重点介绍一下jQuery对象,以及两者相互间的转换…

hls fifo_HLS优化方法DATAFLOW你用了吗

上期内容:异步跨时钟域电路该怎么约束DATAFLOW作为HLS的一种优化方法,对于改善吞吐率(Throughput)、降低延迟(Latency)非常有效。DATAFLOW的作用对象DATAFLOW可以作用于函数,也可以作用于for循环。如下图所示(图片来源Figure62, Figure 63, u…

Java 8虚拟扩展方法

我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了,我对其当前的进展状态感到非常兴奋。 我发现的最新“易于理解”的演示文稿是这样的: http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf 现在,作为一名…

python爬虫 库_七款必备的Python爬虫库,你知道几个?

很多你需要的信息数据都是在网站内,虽然有些网站的数据会以整洁、结构化的形式呈现,但大部分网站却无法做到这样。因此,当你想要获得一些数据的时候,你需要一些爬虫工具帮助抓取,然后再对其进行分析。今天,…