1. 概述
在这个简短的教程中,我们将使用Junit 5中可用的@BeforeAll和@AfterAll注解来实现非静态方法。
2. @BeforeAll和@AfterAll标注非静态方法
在进行单元测试时,我们有时可能希望在非静态的setup和teardowm方法上使用@BeforeAll和@AfterAll注解 - 例如在@Nested测试类中或作为接口默认方法。
让我们创建一个测试类,其中@BeforeAll和@AfterAll方法为非静态:
class BeforeAndAfterAnnotationsUnitTest {
String input;
Long result;
@BeforeAll
void setup() {
input = "77";
}
@AfterAll
void teardown() {
input = null;
result = null;
}
@Test
void whenConvertStringToLong_thenResultShouldBeLong() {
result = Long.valueOf(input);
Assertions.assertEquals(77L, result);
}
}
如果我们运行上面的代码,它会抛出一个异常:
org.junit.platform.commons.JUnitException:
@BeforeAll method 'void cn.tuyucheng.taketoday.junit5.nonstatic.BeforeAndAfterAnnotationsUnitTest.setup()'
must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
现在让我们看看如何避免这种情况。
3. @TestInstance注解
我们将使用@TestInstance注解来配置测试的生命周期。如果我们没有在测试类上声明它,则生命周期模式默认为PER_METHOD。因此,为了防止我们的测试类抛出JUnitException,我们需要使用@TestInstance(TestInstance.Lifecycle.PER_CLASS)对其进行标注。
让我们修改我们的测试类并添加@TestInstance(TestInstance.Lifecycle.PER_CLASS):
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class BeforeAndAfterAnnotationsUnitTest {
String input;
Long result;
@BeforeAll
public void setup() {
input = "77";
}
@AfterAll
public void teardown() {
input = null;
result = null;
}
@Test
public void whenConvertStringToLong_thenResultShouldBeLong() {
result = Long.valueOf(input);
Assertions.assertEquals(77l, result);
}
}
在这种情况下,我们的测试运行成功。
4. 总结
在这篇简短的文章中,我们学习了如何在非静态方法上使用@BeforeAll和@AfterAll注解。首先,我们从一个简单的非静态方法开始,以展示如果我们不包含@TestInstance注解会发生什么。然后,我们使用@TestInstance(TestInstance.Lifecycle.PER_CLASS)标注我们的测试类以解决出现的错误。
与往常一样,所有这些示例的实现都可以在GitHub上找到。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章