Инициализируйте состояние с помощью Spring TestExecutionListener перед выполнением правил JUnit - PullRequest
1 голос
/ 28 мая 2019

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

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

Предварительно обрабатывает тест перед выполнением до обратных вызовов жизненного цикла базовой тестовой платформы

Правила вносят обратные вызовы "до" в тест, поэтому я ожидал, что 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 я должен использовать вместо этого?

1 Ответ

2 голосов
/ 28 мая 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...