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

新手上路,请多包涵

您能否简单解释 @TestInstance 注释及其在 JUnit 5 中的用途?

我认为我们可以通过 制作我们的字段 static 来达到同样的效果。

原文由 Mahozad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 933
2 个回答

我认为 文档 提供了有用的摘要:

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

“per-class”模式比默认的“per-method”模式有一些额外的好处。具体来说,使用“per-class”模式,可以在非静态方法和接口默认方法上声明@BeforeAll 和@AfterAll。因此,“每类”模式也使得在@Nested 测试类中使用@BeforeAll 和@AfterAll 方法成为可能。

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

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

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

原文由 glytching 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

应谨慎使用此注释。所有单元测试都应该相互隔离和独立。如果其中一个测试更改了测试类的状态,那么您不应该使用此功能。

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

原文由 dyVeloper 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题