Kotlintest;如何使用抽象测试容器类



我们有一个用 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 中,您可以从规范(abstract class(扩展,而在 kotlin 中,据我所知,您无法从多个类扩展。

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

有什么指示吗?谢谢!

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

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

据我所知,Kotlintest 正在使用 Junit5 作为测试运行器? 所以它也应该工作。

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

相关内容

  • 没有找到相关文章

最新更新