Как проверить функциональность нескольких приложений, работающих с Spring и JUnit5?

Мое приложение выполняет некоторую нетривиальную пользовательскую инициализацию, используя данные из базы данных. Я хотел бы сделать интеграционный тест, чтобы проверить это поведение. Было бы:

  1. Запустить приложение
  2. Взаимодействовать с приложением (например, зарегистрировать пользователя, смоделировать некоторую активность пользователя...)
  3. Закрой это
  4. Запустите это снова
  5. Убедитесь, что приложение инициализировано правильно в отношении 2.

Поскольку я работаю с платформой Spring Boot, мне не нужно фактически перезапускать приложение, все, что мне нужно, это уничтожить и заново создать компоненты, которые я хочу протестировать. Однако любой подход, который я рассмотрел, имеет какой-то ужасный недостаток.

  1. @DirtiesContext аннотация, как предложено здесь и здесь:

Это не работает для меня, так как я должен был бы иметь два разных метода тестирования. Один для выполнения вышеупомянутого шага 2, а другой для выполнения шага 5. Запуск и завершение приложения будет выполнено путем аннотирования класса тестирования с помощью:

@TestInstance(TestInstance.Lifecycle.PER_METHOD)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

Но, к сожалению, в Junit5 нет возможности указать порядок тестов. Поэтому я не могу быть уверен, что 2 выполняется до 5.

Я пытался аннотировать первый метод испытаний с @BeforeAll а также @BeforeEach, но это как-то сводит на нет последствия @DirtiesContext аннотации и ApplicationContext не сбрасывается.

  1. Ручное использование 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-компоненты, которые необходимо пересоздать, чтобы тест не дал ложного отрицательного результата.

  1. Решение для заказа вручную

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

@Test
fun testMethod1()
{
    // If this method is being executed as the first one
    if (serviceUntouched()) 
        simulateUserActionAsInStep2()
    else
        testServiceAsInStep5(reCreatedService)
}

@Test
fun testMethod2()
{
    testMethod1()
}

В общем, кажется, что нет хорошего выбора, но это кажется достаточно распространенной проблемой. Я пропускаю какое-то очевидное решение?

0 ответов

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