Как проверить функциональность нескольких приложений, работающих с Spring и JUnit5?
Мое приложение выполняет некоторую нетривиальную пользовательскую инициализацию, используя данные из базы данных. Я хотел бы сделать интеграционный тест, чтобы проверить это поведение. Было бы:
- Запустить приложение
- Взаимодействовать с приложением (например, зарегистрировать пользователя, смоделировать некоторую активность пользователя...)
- Закрой это
- Запустите это снова
- Убедитесь, что приложение инициализировано правильно в отношении 2.
Поскольку я работаю с платформой Spring Boot, мне не нужно фактически перезапускать приложение, все, что мне нужно, это уничтожить и заново создать компоненты, которые я хочу протестировать. Однако любой подход, который я рассмотрел, имеет какой-то ужасный недостаток.
Это не работает для меня, так как я должен был бы иметь два разных метода тестирования. Один для выполнения вышеупомянутого шага 2, а другой для выполнения шага 5. Запуск и завершение приложения будет выполнено путем аннотирования класса тестирования с помощью:
@TestInstance(TestInstance.Lifecycle.PER_METHOD)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
Но, к сожалению, в Junit5 нет возможности указать порядок тестов. Поэтому я не могу быть уверен, что 2 выполняется до 5.
Я пытался аннотировать первый метод испытаний с @BeforeAll
а также @BeforeEach
, но это как-то сводит на нет последствия @DirtiesContext
аннотации и ApplicationContext не сбрасывается.
- Ручное использование
ApplicationContext
:
Я бы заново создал бин, который я тестирую, вручную.
@Test
fun test(@Autowired applicationContext: ApplicationContext)
{
simulateUserActionAsInStep2()
val factory = applicationContext.autowireCapableBeanFactory
factory.destroyBean(service)
val reCreatedService = factory.createBean(Service::class.java)
factory.autowireBean(reCreatedService)
testServiceAsInStep5(reCreatedService)
}
Помимо победы в конкурсе красоты, это решение кажется мне хрупким и потенциально неправильным, поскольку я воссоздаю только один боб. Могут быть другие затронутые bean-компоненты, которые необходимо пересоздать, чтобы тест не дал ложного отрицательного результата.
- Решение для заказа вручную
Я мог бы просто добавить некоторый дополнительный код, чтобы два метода выполняли нужные мне действия в указанном порядке:
@Test
fun testMethod1()
{
// If this method is being executed as the first one
if (serviceUntouched())
simulateUserActionAsInStep2()
else
testServiceAsInStep5(reCreatedService)
}
@Test
fun testMethod2()
{
testMethod1()
}
В общем, кажется, что нет хорошего выбора, но это кажется достаточно распространенной проблемой. Я пропускаю какое-то очевидное решение?