使用Junit 5时,如何同时使用 junit4和 PowerMock

news/2024/9/23 2:08:13

在 Java 工程中,可以混合使用 JUnit 4 和 JUnit 5,但需要一些额外的配置,因为 JUnit 4 和 JUnit 5 是两个独立的测试框架,它们的运行方式和依赖不同。为了支持同时运行 JUnit 4 和 JUnit 5 测试,需要引入 JUnit Vintage 引擎,它提供对 JUnit 4 的兼容性支持。

如何混合使用 JUnit 4 和 JUnit 5

以下是具体步骤,帮助你在 Java 项目中同时使用 JUnit 4 和 JUnit 5。

1. 引入 Maven 依赖

pom.xml 中,需要引入 JUnit 5 和 JUnit Vintage 引擎来支持 JUnit 4。以下是需要的依赖项:

<dependencies><!-- JUnit 5 依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.2</version><scope>test</scope></dependency><!-- JUnit Vintage Engine 用于运行 JUnit 4 --><dependency><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId><version>5.9.2</version><scope>test</scope></dependency><!-- JUnit 4 依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- Mockito 用于单元测试(如果需要) --><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.8.1</version><scope>test</scope></dependency>
</dependencies>

2. Gradle 依赖配置

如果你使用 Gradle 而不是 Maven,可以在 build.gradle 中添加类似的依赖:

dependencies {// JUnit 5testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.2'// JUnit 4testImplementation 'junit:junit:4.13.2'// JUnit Vintage Engine for JUnit 4 support in JUnit 5testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.9.2'// Mockito (if needed)testImplementation 'org.mockito:mockito-core:4.8.1'
}

3. 配置 IDE 或构建工具

  • IntelliJ IDEAEclipse 等现代 Java IDE,通常在检测到项目中同时使用 JUnit 4 和 JUnit 5 依赖时,会自动处理并提供混合运行的支持。你只需确保项目配置正确,IDE 会自动识别两种测试。
  • Maven 和 Gradle 也能够自动运行混合测试。只要 JUnit Vintage 引擎配置正确,Maven 和 Gradle 的 test 任务会运行两种测试框架下的测试用例。

4. 编写测试

在项目中,你可以同时编写 JUnit 4 和 JUnit 5 的测试代码。以下是 JUnit 4 和 JUnit 5 测试的基本示例。

  • JUnit 4 测试:
import org.junit.Test;
import static org.junit.Assert.assertEquals;public class JUnit4Test {@Testpublic void testAddition() {assertEquals(4, 2 + 2);}
}
  • JUnit 5 测试:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;public class JUnit5Test {@Testvoid testAddition() {assertEquals(4, 2 + 2);}
}

5. 注意事项

  • JUnit Vintage 引擎用于在 JUnit 5 环境下运行 JUnit 4 测试。没有 JUnit Vintage,你的 JUnit 4 测试将无法运行。
  • 确保测试类的命名方式符合 JUnit 4 或 JUnit 5 的约定,否则某些测试可能不会被正确识别。例如,JUnit 5 的测试类和方法无需使用 public 修饰符,而 JUnit 4 则需要。
  • 如果你使用 Mockito 等第三方库来进行 mock,确保它们与 JUnit 5 兼容。大多数流行的库已经支持 JUnit 5。

6. JUnit 4 与 JUnit 5 特性比较

  • JUnit 4 使用 @Test, @Before, @After, @BeforeClass, @AfterClass 等注解来管理测试生命周期。
  • JUnit 5 使用新的 @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll 注解,并引入了更多特性,如动态测试、嵌套测试、参数化测试等。

总结

  • 通过引入 JUnit Vintage 引擎,你可以在同一项目中混合使用 JUnit 4 和 JUnit 5。
  • JUnit 4 测试仍然可以正常运行,而 JUnit 5 为新开发提供了更强大的特性支持。
  • 使用现代 IDE 或构建工具如 Maven 和 Gradle,可以轻松处理混合使用的情况。

这种方式允许你逐步迁移到 JUnit 5,而无需一次性重写所有现有的 JUnit 4 测试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Java代码审计篇 - ofcms系统审计思路讲解 - 篇2 - SQL注入漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计 1. 前言 我发现很多文章包括教程,大概套路是:只说有漏洞的点,将有漏洞的点指出,然后分析代码;或者黑盒测试出漏洞之后,然后分析代码。 我认为这是在分析漏洞代码,而非代码审计。代码审计文章或教程应该…

Java代码审计篇 - ofcms系统审计思路讲解 - 篇3 - 文件上传漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计 1 文件上传代码审计【有1处】 文件上传漏洞我们需要着重关注的是文件在被java代码解析到保存下来之间有无验证过滤,因此什么样的上传方式,什么样的保存方式都不重要,大家着重关注代码对文件的验证过滤手段…

Java代码审计篇 - ofcms系统审计思路讲解 - 篇4 - XXE漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计 1. XXE代码审计【有1处】 XXE代码审计常搜索的关键字如下: XMLReader SAXBuilder SAXReader SAXParserFactory Digester DocumentBuilderFactory ...还有一个特殊的,用于加载.jrxml 文件,这是 JasperReports 特…

Java反序列化利用链篇 | CC6链分析(通用版CC链)

CC6 CC6和CC1之间的区别 在CC1的LazyMap链中,调用链如下: AnnotationInvocationHandler.readObject() Map(Proxy).entrySet() LazyMap.get() ChainedTransformer.transform() InvokerTransformer.transform() Runtime.exec()而在CC1链中,对CommonsCollections和jdk版本是有限…

Java反序列化利用链篇 | CC3链分析、TemplatesImpl类中的调用链、TrAXFilter、InstantiateTransformer类的transform()【本系列文章的分析重点】

CC3链分析 1. CC3链背景 前面介绍了CC1和CC6,这两条链子虽然前面的入口类不同CC1入口类是AnnotationInvocationHandler CC6入口类是HashMap但是其触发恶意代码的方式是相同的,都是InvokerTransformer.transform()触发Runtime.getRuntime().exec()实现命令执行。而在很多情况下…

VUE学习day one

学习来源:【前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!】https://www.bilibili.com/video/BV1HV4y1a7n4?vd_source=6dac49feb8d7fd76b147c8cf8c0c2b5a Vue是什么?Vue是一个用于构建用户界面(基于数据动态渲染出用户看到的页面)…

全网最适合入门的面向对象编程教程:51 Python 函数方法与接口-使用 Zope 实现接口

在 Python 中,Zope 提供了一种机制来定义和实现接口。Zope 的接口模块通常用于创建可重用的组件,并确保组件遵循特定的接口规范。全网最适合入门的面向对象编程教程:51 Python 函数方法与接口-使用 Zope 实现接口摘要: 在 Python 中,Zope 提供了一种机制来定义和实现接口。…

Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链【本系列文章的分析重点】

CC1链的第二种方式-LazyMap版调用链 目录LazyMap构造payloadCC1的调用链参考链接LazyMap 在之前的CC1链中分析,其实是其中一种方式(国内版本),还有另外一种方式,也是ysoserial中的CC1链的方式(国外版本)。 区别在于调用transform的类是不同的。 在寻找transform调用的时…