扩展 junit 框架_JUnit 5扩展模型的生命周期

扩展 junit 框架

JUnit5最终版本即将来临 (当前是M4),我已经开始尝试如何编写扩展了。

JUnit5中 ,您没有使用RunnersRulesClassRules等,而是只有一个Extension API来实现自己的扩展。

JUnit5提供了多个接口来挂钩其生命周期。 例如,您可以挂钩到“ 测试实例后处理”以在测试实例上调用自定义初始化方法,或者通过“ 参数解析”来在运行时动态解析测试方法参数。 当然,到目前为止,典型的操作如在执行所有测试之前,执行测试之前,执行测试之后进行挂接等等,可以在http://junit.org/junit5/docs/找到完整列表。 当前/用户指南/#extensions-lifecycle-callbacks

但是,在每个过程中都在过程的哪一点执行? 为了测试它,我刚刚创建了一个扩展,该扩展实现了所有接口,并且每个方法都会打印出谁。

public class LoggerExtension implements TestInstancePostProcessor, ParameterResolver, BeforeAllCallback,BeforeEachCallback, BeforeTestExecutionCallback, AfterEachCallback, AfterTestExecutionCallback, AfterAllCallback,TestExecutionExceptionHandler {@Overridepublic void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception {System.out.println("Test Instance Post-processing called");}@Overridepublic boolean supports(ParameterContext parameterContext, ExtensionContext extensionContext)throws ParameterResolutionException {System.out.println("Parameter Resolver Supports called");return parameterContext.getParameter().getType().equals(String.class);}@Overridepublic Object resolve(ParameterContext parameterContext, ExtensionContext extensionContext)throws ParameterResolutionException {System.out.println("Resolver called");return "Hello World";}@Overridepublic void beforeAll(ContainerExtensionContext context) throws Exception {System.out.println("Before All called " + context.getTestClass().get());}@Overridepublic void beforeEach(TestExtensionContext context) throws Exception {System.out.println("Before Each called");}@Overridepublic void beforeTestExecution(TestExtensionContext context) throws Exception {System.out.println("Before Test Execution called");}@Overridepublic void afterEach(TestExtensionContext context) throws Exception {System.out.println("After Each called");}@Overridepublic void afterTestExecution(TestExtensionContext context) throws Exception {System.out.println("After Test Executon called");}@Overridepublic void afterAll(ContainerExtensionContext context) throws Exception {System.out.println("After All called");}@Overridepublic void handleTestExecutionException(TestExtensionContext context, Throwable throwable) throws Throwable {System.out.println("Test Execution Exception called");throw throwable;}
}

然后,我创建了一个包含两个测试的JUnit5测试套件:

@ExtendWith(LoggerExtension.class)
public class AnotherLoggerExtensionTest {@Testpublic void test4() {System.out.println("Test 4");}}
@ExtendWith(LoggerExtension.class)
public class LoggerExtensionTest {@Testpublic void test1() {System.out.println("Test 1");}@Testpublic void test2(String msg) {System.out.println("Test 2 " + msg);}@Testpublic void test3() {System.out.println("Test 3");throw new IllegalArgumentException("");}}
@RunWith(JUnitPlatform.class)
@SelectClasses({LoggerExtensionTest.class, AnotherLoggerExtensionTest.class})
public class LoggerExtensionTestSuite {
}

那么在执行此套件之后,输出是什么? 让我们来看看它。 请注意,出于可读性考虑,我在终端输出上添加了一些标注。

Before All called class AnotherLoggerExtensionTest
Test Instance Post-processing called
Before Each called
Before Test Execution called
Test 4
After Test Execution called
After Each called
After All called// <1>Before All called class LoggerExtensionTest
Test Instance Post-processing called
Before Each called
Before Test Execution called
Test 1
After Test Execution called
After Each called// <2>Test Instance Post-processing called
Before Each called
Before Test Execution called
Parameter Resolver Supports called
Resolver called
Test 2 Hello World
After Test Execution called
After Each called// <3>Test Instance Post-processing called
Before Each called
Before Test Execution called
Test 3
Test Execution Exception called
After Test Execution called
After Each called// <4>After All called

<1>运行它的第一个测试是AnotherLoggerExtensionTest 。 在这种情况下,只有一个简单的测试,因此扩展的生命周期为BeforeAllTest Instance-Post-ProcessingBefore EachBefore Test Execution ,然后执行测试本身,然后执行所有After回调。

<2>然后执行LoggerExtensionTest 。 第一次测试不是参数化测试,因此不会调用与参数解析有关的事件。 在执行test方法之前,将调用测试实例后处理 ,然后再引发所有事件之前。 最终,所有后续事件都将执行测试。

<3>第二个测试包含需要参数解析。 参数解析器Before事件之后和执行测试本身之前运行。

<4>最后一次测试将引发异常。 在执行测试之后但在After事件之前调用Test Execution Exception

最后要注意的是, BeforeAllAfterAll事件是按测试类而不是套件执行的。

本示例中使用的JUnit版本是org.junit.jupiter:junit-jupiter-api:5.0.0-M4

翻译自: https://www.javacodegeeks.com/2017/06/lifecycle-junit-5-extension-model.html

扩展 junit 框架

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

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

相关文章

mqtt服务器数据存储位置,mqtt服务器 数据库

mqtt服务器 数据库 内容精选换一换云服务器备份&#xff1a;云服务器备份可以对普通服务器进行整机备份或部分磁盘备份&#xff0c;不适用于部署了数据库等应用的服务器。支持备份弹性云服务器ECS和裸金属服务器BMS&#xff0c;成本相对于VBS较高&#xff0c;适合对需要备份整个…

固体加热_干货分享| |固体氧化物燃料电池

固体氧化物燃料电池属于第三代燃料电池&#xff0c;是一种在中高温下直接将储存在燃料和氧化剂中的化学能高效、环境友好地转化成电能的全固态化学发电装置。被普遍认为是在未来会与质子交换膜燃料电池一样得到广泛普及应用的一种燃料电池。一般的固体氧化物燃料电池发电系统包…

poi设置列宽自适应_Sentinel 系统自适应限流原理剖析与实战指导

1、Sentinel 系统自适应概述从官方了解到 Sentienl 系统自适应限流是一个全局的概念&#xff0c;对应用入口流量统一进行统一控制&#xff0c;结合应用的机器负载、CPU 使用率&#xff0c;总体平均响应时间、入口 QPS 和并发线程数等几个维度的监控指标从而决定是否调用进行限流…

路径和目录的区别

路径&#xff1a; 终点是目标文件&#xff0c;才叫路径&#xff0c;举例&#xff1a;/Users/liaowenxiong/Downloads/SoftWare for Mac/liaowenxiong.txt 这里的终点就是txt文件&#xff0c;这叫路径&#xff0c;路径是可以直接找到目标文件的。 目录&#xff1a; 终点是文件夹…

Hibernate架构概述

下图提供了Hibernate体系结构的高级视图&#xff1a; 最小的架构 “最小”架构使应用程序管理其自己的JDBC连接&#xff0c;并将这些连接提供给Hibernate&#xff1b; 此外&#xff0c;应用程序自行管理交易。 这种方法使用了最少的Hibernate API子集。 综合架构 Hibernate B…

一个服务器多个网站收录效果,8个优化小技巧快速提高网站收录

网站做好了&#xff0c;我们肯定是想要有更多的免费流量进入到我们的网站&#xff0c;那么我们就必须要了解如何快速提升网站收录。下面小编就来给大家分享一下SEO优化中快速提高网站收录的8个优化小技巧&#xff0c;希望对大家有所帮助。1、网站权重评级网站的权重是对于收录影…

铺铜过孔不要十字_谈谈商周青铜器上圈足的镂孔现象

在商代铜器和西周早期的铜器上&#xff0c;常常会看到带有圈足的器物&#xff0c;圈足有的会有一个孔洞&#xff0c;孔洞的形制有圆形的、十字形的、不规则圆形的等&#xff0c;如簋、觚、盘、豆、尊、罍、瓿、卣、觯、壶等&#xff0c;如下&#xff1a;最近&#xff0c;我们读…

解决eclipse中出现Resource is out of sync with the file system问题

在eclipse中搜索时&#xff0c;搜索完之后有时候会弹出错误对话框&#xff0c;错误摘录如下&#xff1a; Resource is out of sync with the file system… 分析&#xff1a; 有时候因为时间紧迫的原因&#xff0c;所以就没去管它&#xff0c;今天再次遇到它&#xff0c;实在看…

python 字体_python docx字体设置

首先引入依赖包from docx import Documentfrom docx.oxml.ns import qnfrom docx.shared import Pt,RGBColor如果不进行字体手动设置的话&#xff0c;生成的文字字体格式就会千奇百怪&#xff0c;如下图Doc Document()Doc.add_heading("刚来csdn&#xff0c;这就是博客么…

gwt格式_GWT的渐进式Web应用程序配方

gwt格式渐进或不渐进… 如果您已经设计或开发Web应用程序已有一段时间&#xff0c;那么您可能会遇到无数次“渐进式Web应用程序”一词&#xff0c;并且可能会在未来几年内使用。 您可能想知道PWA的确切定义是什么&#xff0c;如何识别PWA&#xff0c;以及如何构建PWA。 根据字典…

光学定位与追踪技术_如何为射线光学仿真创建复杂的透镜几何结构

“射线光学模块”扩展了 COMSOL Multiphysics 软件的建模功能,允许用户引入射线追踪仿真。有了该模块&#xff0c;在集成软件环境中对复杂光学系统的热性能、结构及其他方面进行高阶研究不再是一个难题。创建几何模型是仿真成功的第一步。本文以 Petzval 透镜为例&#xff0c;探…

琥珀ai_琥珀项目:Java的未来暴露

琥珀ai如果一切按计划进行&#xff08;我们正在研究Jigsaw项目&#xff09;&#xff0c;那么Java 9将在不到100天的时间内启动。 您可以在此处加入倒计时以发布它。 它将包含一长串新功能和升级功能&#xff0c;其中一些我们迫不及待想要看到实际应用。 但是&#xff0c;有些功…

MySQL的存储过程和函数简单写法

什么是存储过程 简单的说&#xff0c;就是一组SQL语句集&#xff0c;功能强大&#xff0c;可以实现一些比较复杂的逻辑功能&#xff0c;类似于JAVA语言中的方法&#xff1b; ps:存储过程跟触发器有点类似&#xff0c;都是一组SQL集&#xff0c;但是存储过程是主动调用的&#…

python对excel求和_Python 两个Excel文件对应位置求和并存储

最近~老板给我的工作一直都有对大量的Excel的操作比如两Excel对应位置求和&#xff0c;并存储。(两Excel表格的第一列和第一行是一毛一样的&#xff0c;不需要求和&#xff0c;原样保存&#xff01;)本着能躺着就不坐着的原则&#xff0c;只想快点躺着&#xff0c;果断放弃了手…

zdal配置文件_Autofac的基本使用---4、使用Config配置

准备使用的表是Student&#xff0c;创建相关的IDAL、DAL、IBLL、BLL层。使用EF&#xff0c;创建一个Model层&#xff0c;存放edmx文件。创建一个Infrastructure层&#xff0c;基础设施项目&#xff0c;使用泛型类型。普通类型的使用1.APP.Config 配置信息此处有个需要注意的地方…

判断选择语句switch...case

switch(被检测量){ case 常量1: 语句1; break; case 常量2: 语句2; break; ... deault: 语句N; break; }被检测量的数据类型 基本数据类型&#xff1a;byte、short、int、char引用数据类型&#xff1a;String、enum 穿透 int num 2; switch(num){ case 1: System.out.print…

Java与Python:哪一个最适合您? [信息图]

通过从您的应用程序学习企业APM产品&#xff0c;发现更快&#xff0c;更有效的性能监控。 参加AppDynamics APM导览&#xff01; 在软件开发中&#xff0c;很少有问题比选择编程语言更具分裂性或部落性。 软件开发人员经常以自己选择的工具来强烈地认同自己&#xff0c;将客观…

怎么把php查询到的值显示到下拉框中_RazorSQL for Mac(数据库工具查询)8.5.3

razorsql mac版更新日志变化 查询结果&#xff1a;如果有多个查询结果选项卡&#xff0c;则从查询结果选项卡中选择比较查询结果选项将填充比较工具中的两个查询 漏洞修补 不需要重新启动razorsql才能生效的首选项需要重新启动 自动更新程序不适用于Windows计算机 缺少HBase连接…

docker删除es数据_木杉入门Elasticsearch(4):安装ES

木杉入门本系列的目标是在本地搭建一个Elasticsearch的服务集群&#xff0c;通过在阿里云服务器搭建FRP通道对外提供服务&#xff0c;为小规模应用提供一种高性价比的解决思路。系列内容&#xff1a;木杉入门Elasticsearch(1)&#xff1a;ESXI虚拟机安装CentOS木杉入门Elastics…

MySQL数据库常用命令_常用SQL语句及命令_MySQL常用语句

文章目录一、常用的 SQL 语句&#xff08;一&#xff09;查看当前登录用户&#xff08;二&#xff09;查看当前数据库&#xff08;三&#xff09;如何查看全部用户&#xff1f;&#xff08;四&#xff09;创建数据库&#xff08;五&#xff09;选择要操作的数据库&#xff08;六…