单元测试@TestInstance
单元测试 JUnit5的变化
之前的 Junit4 声明一个类是 Spring Boot 测试类时,需要 @RunWith + @SpringBootTest ,而 Junit5 只需要 @SpringBootTest 就可以了,然后就能使用 SpringBoot 容器中的功能。
场景依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
Junit5 的功能注解都在 Jupiter 包下使用引入时要注意。
在 SpringBoot 整合 Junit5 后,测试类就有 Spring 的功能,添加 @Transactional 标注方法后,执行时会自动添加事务,测试完成后自动回滚。
Junit5 常用注解
跟 Junit4 有很大区别,可以去官网手册对照着看。
https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations
常见的几种注解:
**@Test 😗*表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
**@ParameterizedTest 😗*表示方法是参数化测试,下方会有详细介绍
**@RepeatedTest 😗*表示方法可重复执行
**@DisplayName 😗*为测试类或者测试方法设置展示名称
@BeforeEach :表示在每个单元测试之前执行
@AfterEach :表示在每个单元测试之后执行
@BeforeAll :表示在所有单元测试之前执行
@AfterAll :表示在所有单元测试之后执行
**@Tag 😗*表示单元测试类别,类似于JUnit4中的@Categories
@Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
@Timeout :表示测试方法运行如果超过了指定时间将会返回错误
**@ExtendWith 😗*为测试类或测试方法提供扩展类引用
————————————————
测试类中
//设置类的展示别名 @DisplayName("测试类") public class Junit5Test { @BeforeAll static void testBeforeAll() { System.out.println("测试类中所有测试方法执行前"); } @AfterAll static void testAfterAll() { System.out.println("测试类中所有测试方法执行后"); } @BeforeEach void testBeforeEach() { System.out.println("测试类中每个测试方法执行前"); } @AfterEach void testAfterEach() { System.out.println("测试类中每个测试方法执行后"); } @Test @Disabled void testDisabled() { System.out.println("不会被执行的类"); } @Test @DisplayName("测试类01") void test01() { System.out.println("test01----->>>>>>"); } @Test @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) void testTimeOut() throws InterruptedException { Thread.sleep(500); } }
结果
使用注解 @Disabled 声明方法不用执行,他就不会执行。
使用注解 @TimeOut 声明方法,如果响应时间大于规定的时间就会出现异常
使用 @BeforeAll 、@AfterAll 两个注解时方法必须是 static ,或者类上面用 @TestInstance 注解修饰否则就有异常 @BeforeAll method 'void com.xl.mini.test.Junit5Test.testBeforeAll()' must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
@TestInstance的使用 / @BeforeAll必须为static方法?
摘自:https://www.cnblogs.com/wadelau/p/16932653.html
@BeforeAll
Junit5会在每个测试方法执行之前创建一个新的测试类实例,如果为每个测试方法都新创建实例,如何让@BeforeAll方法在只执行一侧的情况下,每个方法都可以使用到?
在@BeforeAll方法前加上static,那么这个方法会属于测试类而不是类的实例(面试:类的初始化过程)
@TestInstance
这个注解可以用来控制测试类实例的生命周期,这个注解有两种模式,LifeCycle.PER_METHOD (the default) 表示每个测试方法执行前创建新的测试类实例。Lifecycle.PER_CLASS,表示整个测试的过程中之创建一个测试类的实例。
如何在@BeforeAll方法前不加static
测试类加上@TestInstance(Lifecycle.PER_CLASS)即可。
测试实例生命周期
摘自:https://blog.csdn.net/HD243608836/article/details/101000429
为了允许隔离执行单个的测试方法,并避免由于可变测试实例状态而产生的意外副作用,JUnit在执行每个测试方法之前创建每个测试类的新实例(请参阅下面的讲解,何为测试方法)。这个”per-method”测试实例生命周期是JUnit Jupiter中的默认行为,类似于JUnit以前的所有版本。
如果您希望JUnit Jupiter在同一个测试实例上执行所有测试方法,只需使用@TestInstance(Lifecycle.PER_CLASS)
对您的测试类进行注解即可。当使用这种模式时,每个测试类将创建一个新的测试实例。因此,如果您的测试方法依赖于存储在实例变量中的状态,则可能需要在@BeforeEach
或@AfterEach
方法中重置该状态。
“per-class”模式比默认的”per-method”模式有一些额外的好处。具体来说,使用”per-class”模式,可以在非静态方法和接口默认方法上声明@BeforeAll
和@AfterAll(否则@BeforeAll与@AfterAll必须是注解在static的方法上才能生效)
。因此,”per-class”模式也可以在@Nested
测试类中使用@BeforeAll
和@AfterAll
方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架