带有 Kotlin、TestContainers 和外部配置的 SpringBootTest

Posted

技术标签:

【中文标题】带有 Kotlin、TestContainers 和外部配置的 SpringBootTest【英文标题】:SpringBootTest with Kotlin, TestContainers and External configuration 【发布时间】:2020-12-14 05:06:38 【问题描述】:

我在为我的测试类创建外部配置时遇到问题。现在我的 redis 相关测试必须在里面有一个伴生对象

@Testcontainers
@TestPropertySource("classpath:/application-test.properties")
@SpringBootTest
class RedisRelatedTest 

  companion object 
    @Container
    val container = GenericContainer<Nothing>("redis:5.0.7-alpine")
            .apply  withExposedPorts(6379) 

    @JvmStatic
    @DynamicPropertySource
    fun properties(registry: DynamicPropertyRegistry) 
        registry.add("spring.redis.host", container::getHost);
        registry.add("spring.redis.port", container::getFirstMappedPort);
    
  
  ... some tesitng

我想把它移到外面的某个地方,并使用一些衬里来包含它,但我找不到可行的方法。我用它的伴生对象创建了一个 RedisConfig 类,但是 @Import(RedisConfig::class) 或 @Import(RedisConfig.Congig::class) 被完全忽略了。

【问题讨论】:

【参考方案1】:

@Import(RedisConfig::class) 本身不做任何事情,你仍然需要自动装配一个 bean,你也这样做了吗?

另一种选择是拥有一个带有容器的抽象类并在测试类中扩展它。

【讨论】:

【参考方案2】:

@Import(RedisConfig::class) 不起作用。 如果是 @SpringTest 你应该使用:

@SpringBootTest(
    classes = [RedisConfig::class])

但我不确定 testcontainer 注释是否会按您的预期工作。我按照我在对类似问题的回复中描述的方式解决了这个问题:https://***.com/a/66532851/3484423

【讨论】:

以上是关于带有 Kotlin、TestContainers 和外部配置的 SpringBootTest的主要内容,如果未能解决你的问题,请参考以下文章

带有 testcontainers 和 jOOQ 的 Spring Boot 不会注入 DSL 上下文

我可以在 JDBC URL 模式下使用带有自定义 Dockerfile 的 Testcontainers 吗?

在 Gitlab-ci 中使用带有 docker-compose 的 Testcontainers 运行端到端测试

将测试容器与另一个数据库驱动程序一起使用

如何在多个 SpringBootTests 之间重用 Testcontainers?

SpringBoot 集成测试 Sybase 和 Testcontainers