gpt4 book ai didi

java - junit5 扩展的 BeforeAll/AfterAll 回调针对每个嵌套测试类执行。这是预期的吗?

转载 作者:行者123 更新时间:2023-12-02 03:58:56 25 4
gpt4 key购买 nike

我有一个测试类,里面有多个嵌套测试类。外部测试类使用实现 BeforeAllCallback 和 AfterAllCallback 的扩展。当执行外部测试类时,每个嵌套类都会调用这些接口(interface)的方法。这是预期的行为吗?我找不到任何明确指定这一点的文档。

外部测试类也有@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");
}
}
}
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");
}
}

通向输出:

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

最佳答案

观察到的行为的原因是,您添加到 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();
}

}

据我所知,Jupiter 没有机制将扩展限制在 @ExtendWith 注释的位置。您可以提出一个问题来请求此功能。

关于java - junit5 扩展的 BeforeAll/AfterAll 回调针对每个嵌套测试类执行。这是预期的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60774567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com