Art*_*hur 4 kotlin docker spring-boot testcontainers testcontainers-junit5
我在我的oss软件中使用testcontainer,但我认为我的配置或docker/testcontainer运行时有问题......
我有一些测试,当它们分开运行时,一切正常,但是当我尝试运行所有测试时,最后一个测试由于应用程序尝试与容器连接时出现问题而失败。
调试问题我发现容器在一个端口启动,但应用程序正在尝试在其他端口连接,其中大部分在最后运行的测试类中使用
所有测试正在运行:
失败的测试之一向我显示了以下日志:
当类启动时容器启动UserControllerTest使用另一个端口,如下所示:
我的测试配置基于一个抽象类(见下文),就像所说的那样,如果运行仅显示错误的类,则一切正常。
@Testcontainers
@ActiveProfiles("test")
@ExtendWith(SpringExtension::class)
@TestMethodOrder(value = OrderAnnotation::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
abstract class AbstractTest {
companion object {
@Container
private val redisContainer = GenericContainer<Nothing>("redis:6-alpine")
.apply {
withExposedPorts(6379)
withCreateContainerCmdModifier { cmd -> cmd.withName("wb-test-cache") }
}
@Container
private val postgresContainer = PostgreSQLContainer<Nothing>("postgres:13-alpine")
.apply {
withExposedPorts(5432)
withUsername("sa_webbudget")
withPassword("sa_webbudget")
withDatabaseName("webbudget")
withCreateContainerCmdModifier { cmd -> cmd.withName("wb-test-database") }
}
@JvmStatic
@DynamicPropertySource
fun dynamicPropertiesRegister(registry: DynamicPropertyRegistry) {
registry.add("spring.datasource.url", postgresContainer::getJdbcUrl)
registry.add("spring.redis.host", redisContainer::getHost)
registry.add("spring.redis.port", redisContainer::getFirstMappedPort)
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人见过这样的事情,知道如何解决吗?
Art*_*hur 10
经过一番研究,我找出了问题所在:上下文。
当 spring 运行第一个 mvc 控制器测试时,它会为所有控制器启动一个 tomcat 实例,这意味着当 testcontainers 为数据库重新创建 docker 实例时(在新控制器开始测试之后),属性(端口、URL ..)不会被改变。更新是因为 spring 将重用当前的 tomcat 实例(来自上次 mvc 测试)
解决方案:将每个测试类的上下文标记为脏,这将使 spring 在每次新的测试类启动时重新创建上下文,这将触发dynamicPropertiesRegister正确更新属性。
我只需将此注释添加@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)到我的AbstractTest
| 归档时间: |
|
| 查看次数: |
3302 次 |
| 最近记录: |