JUnit 5 测试问题 throws java.lang.Exception’ must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS)
在运行测试的时候提示下面的错误:
org.junit.platform.commons.JUnitException: @BeforeAll method 'protected void com.ossez.edtestbank.tests.QuestionTest.setUp() throws java.lang.Exception' must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
测试实例生命周期
为了允许隔离执行单个的测试方法,并避免由于可变测试实例状态而产生的意外副作用,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
方法。
如果使用Kotlin编程语言编写测试,则可能会发现,通过切换到”per-class”测试实例生命周期模式,可以更轻松地实现 @BeforeAll
和 @AfterAll
方法。
使用静态方法
因为下面的方法:
@BeforeAll
protected void setUp() throws Exception {
Factory.beginTransaction();
}
没有使用静态方法,所以提示上面的错误,你可用使用静态方法后运行。
你的测试方法应该不会提示错误。
Lifecycle.PER_METHOD
在方法中使用
@TestInstance(TestInstance.Lifecycle.PER_METHOD)
来定义测试。
使用上面的方法就可以让你的测试执行了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-09-15 Hibernate 5 开始使用指南前言