Cla*_*udi 7 java testing junit5
我有一个测试类,里面有多个嵌套的测试类。外部测试类使用实现 BeforeAllCallback 和 AfterAllCallback 的扩展。在执行外部测试类时,会为每个嵌套类调用这些接口的方法。这是预期的行为吗?我找不到任何明确指定这一点的文档。
外部测试类也有@BeforeAll 和@AfterAll 方法。这些在执行外部测试类时执行一次。我有点期望扩展的行为相同。
如果这种行为确实是预料之中的,有没有办法抑制它?
这是一个最小的代码示例。但是,非自定义扩展(例如 SpringExtension)显示相同的行为:
@ExtendWith(MyExtension.class)
public class SomeTest {
@BeforeAll
static void create() {
System.out.println("Call beforeAll of test class");
}
@AfterAll
static void destroy() {
System.out.println("Call afterAll of test class");
}
@Nested
class InnerTest1 {
@Test
void testingA() {
System.out.println("Test 1A");
}
@Test
void testingB() {
System.out.println("Test 1B");
}
}
@Nested
class InnerTest2 {
@Test
void testingA() {
System.out.println("Test 2A");
}
@Test
void testingB() {
System.out.println("Test 2B");
}
}
}
Run Code Online (Sandbox Code Playgroud)
public class MyExtension implements BeforeAllCallback, AfterAllCallback {
public MysqlMockExtension() {
}
@Override
public void beforeAll(final ExtensionContext extensionContext) throws Exception {
System.out.println("Call beforeAll of extension");
}
@Override
public void afterAll(final ExtensionContext extensionContext) throws Exception {
System.out.println("Call afterAll of extension");
}
}
Run Code Online (Sandbox Code Playgroud)
导致输出:
Call beforeAll of extension
Call beforeAll of test class
Call beforeAll of extension
Test 2A
Test 2B
Call afteeAll of extension
Call beforeAll of extension
Test 1A
Test 1B
Call afteeAll of extension
Call afterAll of test class
Call afteeAll of extension
Run Code Online (Sandbox Code Playgroud)
观察到的行为的原因是,您添加到 Jupiter 中的测试类的所有扩展都被其所有子项继承,无论是测试方法还是嵌套的测试类。您可以做的是检查使用扩展名的类是否是顶级类:
class MyExtension implements BeforeAllCallback {
@Override
public void beforeAll(final ExtensionContext extensionContext) throws Exception {
if (extensionContext.getTestClass().isPresent()) {
Class<?> currentClass = extensionContext.getTestClass().get();
if (isNestedClass(currentClass)) {
return;
}
}
System.out.println("Call beforeAll of extension");
}
private boolean isNestedClass(Class<?> currentClass) {
return !ModifierSupport.isStatic(currentClass) && currentClass.isMemberClass();
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,Jupiter 没有机制来限制对@ExtendWith注释位置的扩展。您可能会打开一个问题来请求此功能。