我们有一个用 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
? 我考虑过beforeAll
or afterAll
in ProjectConfig
,但我不想要或不需要所有测试的测试容器,只有那些需要数据源的测试容器。然后是参考文献TestListener
中描述的概念,但我也很难重写。
任何指针?谢谢!