关于junit4:BeforeClass(Junit 4)和BeforeEach(Junit5)有什么区别

What is difference between BeforeClass (Junit 4 ) and BeforeEach(Junit5)

这两个注释都用于表示已注释的方法应在当前测试类中的每个Test方法之前执行。

那么,为什么要将注释从@BeforeClass-Junit 4更改为@BeforeEach Junit 5?

我缺少在junit 5中添加的任何其他东西吗?

其他注释也是如此。


添加的主要功能是对测试实例生命周期的更细粒度控制,例如通过@TestInstance注释。我认为这是更改旧@Before@BeforeClass批注的名称的原因之一。

旧的(JUnit4)@Before和新的(JUnit5)@BeforeEach相似之处在于,它们在测试类中的每个@Test方法之前都重新执行。因此,如果您的类有10个测试方法,则@BeforeEach方法将执行10次。

旧的(JUnit4)@BeforeClass和新的(JUnit5)@BeforeAll相似,因为它们都只在类中的任何测试之前执行一次。因此,即使您的类有10个测试,@BeforeAll方法也只执行一次。

因此,在问题中提出的将@BeforeClass重命名为@BeforeEach的建议是不正确的。

有关更多信息,请参见有关@ Before,@ BeforeClass,@ BeforeEach和@BeforeAll之间的区别的问题。


有一些相关的更改,要求测试类首先使用@TestInstance(Lifecycle.PER_CLASS)进行注释。这将为每个测试类而不是每个方法创建一个新的测试实例。

结果,您可以将@BeforeAll@AfterAll用于非静态方法以及接口默认方法。它还允许您在@Nested测试类中使用@BeforeAll@AfterAll

如果使用Lifecycle.PER_CLASS,则必须记住,如果测试依赖于存储在实例变量中的状态,则可能必须在@BeforeEach@AfterEach中重置该状态。