JUnit5 реагирует на сбой @ Before * методов - PullRequest
1 голос
/ 03 апреля 2020

Есть ли в Junit5 ловушка, которая реагирует на сбои в методах @ Before *?

Я использую метод @BeforeAll для инициализации среды для своих тестов. Но эта инициализация может иногда не удаться. Я хочу сбросить среду, чтобы выяснить, в чем дело, но мне нужно сделать это до вызова методов @ After *, которые очистят среду и уничтожат всю информацию.

Мы говорим о десятках эти методы @BeforeAll для всего набора тестов, поэтому делать это вручную внутри каждого метода не вариант.

Я уже пробовал это, но не повезло:

  • TestWatcher не работает для этого, так как он срабатывает только при выполнении реального теста.
  • TestExecutionListener.executionFinished выглядит многообещающе, но он запускается после всех методов @After, что для меня слишком поздно.
  • Я даже пытался сделать это внутри методов очистки @AfterAll, до фактической очистки. Но не нашел способа определить, какие тесты были выполнены или что-то не получилось.

Есть идеи?

1 Ответ

0 голосов
/ 13 апреля 2020

Я полагаю, что "сбои в @ до * методах" вы имеете в виду исключения? Если это так, вы можете использовать модель расширения следующим образом:

@ExtendWith(DumpEnvOnFailureExtension.class)
class SomeTest {

    static class DumpEnvOnFailureExtension implements LifecycleMethodExecutionExceptionHandler {

        @Override
        public void handleBeforeAllMethodExecutionException(final ExtensionContext context, final Throwable ex)
                throws Throwable {
            System.out.println("handleBeforeAllMethodExecutionException()");
            // dump env
            throw ex;
        }

    }

    @BeforeAll
    static void setUpOnce() {
        System.out.println("setUpOnce()");
        throw new RuntimeException();
    }

    @Test
    void test() throws Exception {
        // some test
    }

    @AfterAll
    static void tearDownOnce() {
        System.out.println("tearDownOnce()");
    }

}

Журнал будет:

setUpOnce()
handleBeforeAllMethodExecutionException()
tearDownOnce()

То есть расширение уведомляется, если метод @BeforeAll завершается неудачей с исключением. (Обратите внимание, что это просто MWE, для фактической реализации вы должны извлечь DumpEnvOnFailureExtension и использовать его там, где это необходимо.)

Для получения дополнительной информации см. Раздел «Обработка исключений» в руководство пользователя.

...