2017-12-27 203 views
0

这两个注释都用来表示在当前测试类的每个Test方法之前应该执行带注释的方法。BeforeClass(Junit 4)和BeforeEach(Junit5)之间的区别

那么我们为什么要将注释从更改为@BeforeClass - Junit 4至@BeforeEach Junit 5

还有什么额外的,已添加在junit 5,我失踪了?

其他注释的类似情况。

+1

不,这不是BeforeClass的目的。阅读javadoc。但名称已经改变,因为......他们认为新名称更好。由于它是一个新的,不兼容的版本,为什么不更改名称? –

+4

'@ Before'被重命名为'@ BeforeEach'(并且'@ BeforeClass'被重命名为'@ BeforeAll')。正如你已经提到的那样,它们是“在每种测试方法之前执行的”。所以这是一个很好的新名字。 –

+0

感谢您检查此内容。 BeforeClass也用于在类中的任何测试方法之前运行一次,因此两者都是相同的。这是如果他们刚刚改变了名字。我想知道他们是否在新注释中添加了任何额外的东西 – Niraj

回答

1

添加的主要功能是对Test Instance Lifecycle进行更细粒度的控制,例如通过@TestInstance注释。我认为这是更改旧的@Before@BeforeClass注释名称的原因之一。

旧(JUnit4)@Before和新(JUnit5)@BeforeEach是在它们被执行类似重新之前每@Test方法在测试类。所以如果你的班级有10种测试方法,@BeforeEach方法会执行10次。

老(JUnit4)@BeforeClass和新(JUnit5)@BeforeAll很相似,它们都只是执行一次,在任何类中的测试。所以即使你的班级有10次测试,@BeforeAll方法也只执行一次。

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

有关更多信息,另请参阅this question关于@Before,@BeforeClass,@BeforeEach和@BeforeAll之间的区别。

2

有一些相关的变化需要先用@TestInstance(Lifecycle.PER_CLASS)对测试类进行注释。这将为每个测试类而不是每个方法创建一个新的测试实例。

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

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