Я хочу инициализировать состояние перед каждым тестовым случаем Spring Boot JUnit с помощью TestExecutionListener
. Эта инициализация должна запускать до, вызывается соответствующий обратный вызов JUnit @Rule
s.
Я ожидал, что 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
я должен использовать вместо этого?
Если вы хотите инициализировать состояние для каждого теста непосредственно перед выполнением Rule
, вы должны использовать метод prepareTestInstance
интерфейса TestExecutionListener
.
@Override
public void prepareTestInstance(TestContext testContext) {
System.out.println("inside prepareTestInstance");
}
Таким образом, вы будете выполнять методы в следующем порядке:
prepareTestInstance()
rule.before()
test1()
Обратите внимание, что prepareTestInstance
будет выполнено перед каждым методом тестирования