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

问题描述 投票:3回答:1

我有一个带有多个嵌套测试类的测试类。外部测试类使用实现了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");
        }
    }
}
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
java testing junit5
1个回答
0
投票

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

}

据我所知,木星没有机制将扩展名限制在@ExtendWith注释的位置。您可能会打开一个问题来请求此功能。

© www.soinside.com 2019 - 2024. All rights reserved.