Как создать Extension, который запускается beforeAll только один раз для всего большого класса со многими вложенными классами внутри

Учитывая мой проверенный класс со многими вложенными классами внутри:

class TestWithManyNested {

    @RegisterExtension
    static MyExtension extension = new MyExtension();

    @Nested
    class Nested1 {

        @Test
        void nested1() {
        }
    }

    @Nested
    class Nested2 {

        @Test
        void nested2() {
        }
    }
}

Вот мое простое расширение:

static class MyExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback {

        @Override
        public void beforeAll(ExtensionContext extensionContext) throws Exception {
            System.out.println("beforeAll");
        }

        @Override
        public void afterAll(ExtensionContext extensionContext) throws Exception {
            System.out.println("afterAll");
        }
    }

Как я могу запустить свой TestWithManyNested с MyExtension которые просто бегут beforeAll только один раз за весь тест

1 ответ

Решение

Если вы хотите, чтобы обратные вызовы уровня класса выполнялись только для самого внешнего класса, вы можете переписать свое расширение следующим образом (проверяя, что для внешнего класса нет "включающего класса").

static class MyExtension implements BeforeAllCallback, AfterAllCallback {

    @Override
    public void beforeAll(ExtensionContext extensionContext) throws Exception {
        Class<?> testClass = extensionContext.getRequiredTestClass();
        if (testClass.getEnclosingClass() == null) {
            System.err.println("beforeAll: " + testClass.getName());
        }
    }

    @Override
    public void afterAll(ExtensionContext extensionContext) throws Exception {
        Class<?> testClass = extensionContext.getRequiredTestClass();
        if (testClass.getEnclosingClass() == null) {
            System.err.println("afterAll: " + testClass.getName());
        }
    }
}
Другие вопросы по тегам