What is difference between BeforeClass (Junit 4 ) and BeforeEach(Junit5)
这两个注释都用于表示已注释的方法应在当前测试类中的每个Test方法之前执行。
那么,为什么要将注释从@BeforeClass-Junit 4更改为@BeforeEach Junit 5?
我缺少在junit 5中添加的任何其他东西吗?
其他注释也是如此。
-
不,那不是BeforeClass的用途。 阅读javadoc。 但是名称已更改,因为...他们认为新名称更好。 由于它是一个新的不兼容的版本,为什么不更改名称?
-
@Before重命名为@BeforeEach(@BeforeClass重命名为@BeforeAll)。 正如您已经提到的,它们是"在每种测试方法之前执行的"。 因此,这是一个好名字。
-
感谢您检查。 BeforeClass还用于在该类中的任何测试方法之前运行一次,因此两者相同。 如果他们刚刚更改了名称,我想知道他们是否在新注释中添加了任何其他内容
添加的主要功能是对测试实例生命周期的更细粒度控制,例如通过@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中重置该状态。