Инициализировать состояние с помощью Spring TestExecutionListener до запуска правил JUnit

Я хочу инициализировать состояние перед каждым тестовым случаем Spring Boot JUnit с помощью TestExecutionListener. Эта инициализация должна запускать до, вызывается соответствующий обратный вызов JUnit @Rules.

Я ожидал, что beforeTestMethod подойдет для этого, потому что его комментарий JavaDoc говорит

Pre-processes a test before execution of before lifecycle callbacks of the underlying test framework

Правила вносят вклад «до» обратных вызовов в тест, поэтому я ожидал, что beforeTestMethod будет выполнен до правила. Однако отладчик показывает, что это не так!


Это структура моего кода:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners(listeners = MyTestExecutionListener.class, mergeMode = MergeMode.MERGE_WITH_DEFAULTS)
public class MyTest {

    @Autowired
    @Rule
    public MyRule rule;

    @Test
    public void test1() {
        // ...
    }

    // ... more tests
}
public class MyTestExecutionListener implements TestExecutionListener {

    @Override
    public void beforeTestMethod(TestContext testContext) {
        // ...
    }
}
@Component
public class AutoLogin extends ExternalResource {

    @Override
    protected void before() {
        // ...
    }
}

Я хочу, чтобы методы выполнялись в порядке

  • beforeTestMethod()
  • rule.before()
  • test1()

но реальный порядок

  • rule.before()
  • beforeTestMethod()
  • test1()

Любые идеи, что я делаю неправильно, или какой другой метод TestExecutionListener я должен использовать вместо этого?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите инициализировать состояние для каждого теста непосредственно перед выполнением Rule, вы должны использовать метод prepareTestInstance интерфейса TestExecutionListener.

@Override
public void prepareTestInstance(TestContext testContext) {
    System.out.println("inside prepareTestInstance");
}

Таким образом, вы будете выполнять методы в следующем порядке:

  • prepareTestInstance()
  • rule.before()
  • test1()

Обратите внимание, что prepareTestInstance будет выполнено перед каждым методом тестирования

Другие вопросы по теме