当前位置: 首页 > 知识库问答 >
问题:

junit5扩展的BeforeAll/AfterAll回调对每个嵌套测试类执行。这是意料之中的吗?

乐正意智
2023-03-14

我有一个测试类,里面有多个嵌套的测试类。外部测试类使用实现BeforeAllCallback和AfterAllCallback的扩展。在执行外部测试类时,为每个嵌套类调用这些接口的方法。这是意料之中的行为吗?我找不到任何明确说明这一点的文档。

@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

共有1个答案

仲孙磊
2023-03-14

观察到的行为的原因是,在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注释的位置。您可能会打开一个问题来请求此功能。

 类似资料:
  • 我有一个简单的 Junit 5 Siute,带有@BeforeAll和@AfterAll注释。执行套件,但这些方法不会在执行所有类之前和之后执行。

  • 在为Neo4j编写测试用例时,我希望只使用JUnit5扩展模型,而不使用或。目前,我只能找到JUnit4的Neo4j测试包,它使用,并且依赖于和。 是否有使用扩展模型的JUnit5的Neo4j测试套件? 参考: Neo4j:Home,GitHub Neo4j:Maven,GitHub,pom.xml JUnit 4:GitHub JUnit 4:JUnit 4指南,JUnit 4.12 API,N

  • 在JUnit5中,我试图获得一个从扩展运行的测试类方法。我正在使用JUnit5扩展接口TestWatcher,并重写testFailed()方法。 这个扩展的目的是在测试类的Selenium WebDriver浏览器中拍摄失败的屏幕快照,并将其附加到该测试的诱惑报告中。test class方法有实例化的浏览器和注释,用于附加到Allure。并且我的takeScreenshot方法依赖浏览器和来自测

  • 注意:我已经在另一篇文章中解决了这个问题,所以在嵌套的Java8并行流操作中使用信号量可能会造成死锁。这是窃听器吗?-,但这篇文章的标题暗示问题与一个信号量的使用有关--这多少分散了讨论的注意力。我创建这个例子是为了强调嵌套循环可能存在性能问题--尽管这两个问题可能有一个共同的原因(也许是因为我花了很多时间来解决这个问题)。(我不认为它是一个重复,因为它强调了另一个症状--但如果你真的这么做了,就

  • 我有15节6月5日的课要考试。当我从maven运行它们时,afterAll()被执行了15次,这导致了15次对Slack Webhook的通知。还有什么我需要只发送一个通知吗?

  • 我在处理一个项目时遇到了这段代码,这被报告为某些内容的错误。 我认为这段代码的意思是: 我认为这只是用一个名为 的引用变量实例化类 。 用户提到的内容: 用户提到这是外部类中的嵌套类,但我对如何嵌套类本身感到困惑。 我所研究的: 我使用名为ANTLR的代码解析器来解析此代码,它表明这不是一个类,而是使用了令牌类型。 提前致谢