@TestInstance注释在 JUnit 5 中有什么用?

2022-08-31 19:52:39

您能简单解释一下注释,以及它在 JUnit 5 中的用处吗?@TestInstance

我认为我们可以通过使我们的字段静态来达到相同的效果。


答案 1

我认为这些文档提供了一个有用的摘要:

如果您希望 JUnit Jupiter 在同一个测试实例上执行所有测试方法,只需使用 @TestInstance(Lifecycle.PER_CLASS) 注释测试类即可。使用此模式时,将为每个测试类创建一次新的测试实例。因此,如果您的测试方法依赖于实例变量中存储的状态,则可能需要在@BeforeEach或@AfterEach方法中重置该状态。

与默认的“每方法”模式相比,“每类”模式具有一些额外的好处。具体来说,使用“每类”模式,可以在非静态方法以及接口默认方法上声明@BeforeAll和@AfterAll。因此,“每类”模式还可以在@Nested测试类中使用@BeforeAll和@AfterAll方法。

但是,您可能已经阅读了该内容,并且您正确地认为,使字段成为静态字段将具有与将字段声明为实例变量并使用 相同的效果。@TestInstance(Lifecycle.PER_CLASS)

因此,也许“它在JUnit 5中如何有用”这个问题的答案是使用...@TestInstance

  • 明确说明您的意图。可以假设使用 static 关键字是偶然的,而 使用 %不太可能是偶然的,或者是无复制粘贴的结果。@TestInstance
  • 将管理范围和生命周期以及清理的责任委派给框架,而不必记住自己管理它。

答案 2

引入此批注是为了减少运行单元测试时创建的对象数。

添加到测试类将避免为类中的每个测试创建类的新实例。当您在同一测试类中有很多测试并且该类的实例化成本高昂时,这尤其有用。@TestInstance(TestInstance.Lifecycle.PER_CLASS)

应谨慎使用此注释。所有单元测试都应该是隔离的,并且彼此独立。如果其中一个测试更改了测试类的状态,则不应使用此功能。

使字段静态以达到相同的效果不是一个好主意。它确实会减少创建的对象数,但是当执行测试类中的所有测试时,无法清理它们。当您拥有一个巨大的测试套件时,这可能会导致问题。


推荐