首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlintest;如何使用抽象testcontainers类

Kotlintest;如何使用抽象testcontainers类
EN

Stack Overflow用户
提问于 2019-09-17 18:11:10
回答 1查看 780关注 0票数 0

我们有一个用kotlin编写的Spring Boot项目(第一次),其中我们想尝试kotlintest来编写测试。

我们的数据源是一个postgresql数据库,在我们的测试中,为了不使用像h2这样的单独数据源,或者在我们的实际数据库中使用测试模式,我们使用org.testcontainers:postgresql。由于启动一个testcontainer是一个有点冗长的操作,我们希望它只在多个测试中执行一次。

我们使用liquibase来进化数据库模式。

因此,考虑到这一点,我们创建了一个抽象类ContainerDatabaseTest,其他测试可以从中扩展:

代码语言:javascript
复制
class KPostgresContainer(imageName: String) : PostgreSQLContainer<KPostgresContainer>(imageName)

@ContextConfiguration(initializers = [ContainerDatabaseTest.Initializer::class])
abstract class ContainerDatabaseTest {
    companion object {
        val container: KPostgresContainer = KPostgresContainer("postgres:9.6.15")
                .withDatabaseName("ic_orders_testcontainer_test")
                .withUsername("ic_orders")
                .withPassword("ic_orders")

        init {
            container.start()
        }
    }

    class Initializer : ApplicationContextInitializer<ConfigurableApplicationContext> {
        override fun initialize(configurableApplicationContext: ConfigurableApplicationContext) {
            val values = TestPropertyValues.of(
                    "spring.datasource.url=${container.jdbcUrl}",
                    "spring.datasource.username=${container.username}",
                    "spring.datasource.password=${container.password}",
                    "spring.liquibase.user=${container.username}",
                    "spring.liquibase.password=${container.password}"
            )
            values.applyTo(configurableApplicationContext)
        }
    }
}

这将启动一个testcontainer,在测试运行期间扩展它的所有测试中执行一次。

然后像这样使用JUnit5来使用它

代码语言:javascript
复制
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class RepositoriesTests @Autowired constructor(
        val em: TestEntityManager,
        val moveOrderPlacementRepository: MoveOrderPlacementRepository
) : ContainerDatabaseTest() {

    @Test
    fun `Persist an object to database`() {
        em.persist(someObject)

但是,如何将这些测试重写为kotlintest呢?在kotlintest中,你可以从一个规范(也可以是abstract class)进行扩展,而在kotlin中,据我所知,你不能从多个类进行扩展。

那么我该如何将这个测试移植到kotlintest上呢?我考虑过在ProjectConfig中使用beforeAllafterAll,但我不想或需要为所有测试使用测试容器,只针对那些需要数据源的测试。然后是reference中描述的TestListener概念,但我也很难重写它。

有什么建议吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-10-10 19:50:26

这里的问题是TestContainers。目前,@TestContainers注解将不会被继承(有一个open issue对此进行了修改,似乎会在下一个版本中得到修复)。作为变通方法,您可以使用@TestContainers注释父类和测试类,直到它被修复。

要使用junit5,您将需要org.testtainers:junit-jupiter依赖项以及testcontainers依赖项本身。jupiter one将为您的项目添加junit5扩展。

据我所知,kotlintest正在使用junit5作为测试器?所以它应该也能正常工作。

编辑:这个问题现在已经修复了。因此,您只需要用@TestContainers注释父类

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57972025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档