Kotlin интеграционных тестов с Spring Boot - PullRequest
1 голос
/ 11 апреля 2020

Что у меня есть: я разрабатываю микросервис, используя Spring Boot с Web и MongoDB в качестве хранилища. Для интеграционных тестов CI я использую тестовые контейнеры. У меня есть два теста интеграции с аннотациями SpringBootTest, которые используют класс TestConfig. Класс TestConfig обеспечивает настройку тестового контейнера MongoDB с фиксированными открытыми портами.

Моя проблема: когда я запускаю свои тесты по одному, тогда они проходят успешно. Но когда я запускаю свои тесты одновременно, они не проходят.

MongoContainerConfig.kt

@TestConfiguration
class MongoContainerConfig {

    var mongoContainer: GenericContainer<Nothing>

    constructor() {
        mongoContainer = FixedHostPortGenericContainer<Nothing>("mongo")
                .withFixedExposedPort(27018,27017)
        mongoContainer.start()
    }

    @PreDestroy
    fun close() {
        mongoContainer.stop()
    }
}

Первый тест

@SpringBootTest(
    classes = arrayOf(MongoContainerConfig::class, AssertUtilsConfig::class),
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
class CardControllerTest {

    @Test
    fun test() {}
}

Второй тест

@SpringBootTest(classes = arrayOf(MongoContainerConfig::class, AssertUtilsConfig::class))
class PositiveTest {

    @Test
    fun test() {}
}

Ошибка msg

Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoContainerConfig': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.lang.card.engcard.config.MongoContainerConfig$$EnhancerBySpringCGLIB$$e58ffeee]: Constructor threw exception; nested exception is org.testcontainers.containers.ContainerLaunchException: Container startup failed
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1320)
    a

Этот проект вы можете увидеть на github с CI https://github.com/GSkoba/eng-card/runs/576320155?check_suite_focus=true

Это очень забавно, потому что тесты работают, если переписать их в java

1 Ответ

0 голосов
/ 14 апреля 2020

Ха, это не просто) https://docs.spring.io/spring/docs/5.2.5.RELEASE/spring-framework-reference/testing.html#testcontext -ctx-management-caching Тесты имеют различный контекст и поэтому MongoContainerConfig вызывается дважды. Исправить - добавить webEnv как в CardControllerTest.kt

@SpringBootTest(classes = arrayOf(MongoContainerConfig::class, AssertUtilsConfig::class),
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class PositiveTest 

Доказательство https://github.com/GSkoba/eng-card/actions/runs/78094215

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