0

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

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

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

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

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)
        }
    }
}

这会启动一个测试容器,一次在测试运行期间扩展它的所有测试。

然后像这样使用 JUnit5

@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 中,您也可以从 Spec (abstract class以及)扩展,而据我所知,在 kotlin 中,您不能从多个类扩展。

那么我将如何将此测试移植到kotlintest? 我考虑过beforeAllor afterAllin ProjectConfig,但我不想要或不需要所有测试的测试容器,只有那些需要数据源的测试容器。然后是参考文献TestListener中描述的概念,但我也很难重写。

任何指针?谢谢!

4

1 回答 1

1

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

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

据我所知,kotlintest 使用 junit5 作为测试运行程序?所以它也应该工作。

编辑:这已经被修复了。因此,您只需要使用 @TestContainers 注释 Parent 类

于 2019-10-10T11:50:26.453 回答