我们有一个用kotlin编写的Spring Boot项目(第一次),其中我们想尝试kotlintest来编写测试。
我们的数据源是一个postgresql数据库,在我们的测试中,为了不使用像h2这样的单独数据源,或者在我们的实际数据库中使用测试模式,我们使用org.testcontainers:postgresql。由于启动一个testcontainer是一个有点冗长的操作,我们希望它只在多个测试中执行一次。
我们使用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)
}
}
}这将启动一个testcontainer,在测试运行期间扩展它的所有测试中执行一次。
然后像这样使用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上呢?我考虑过在ProjectConfig中使用beforeAll或afterAll,但我不想或需要为所有测试使用测试容器,只针对那些需要数据源的测试。然后是reference中描述的TestListener概念,但我也很难重写它。
有什么建议吗?谢谢!
发布于 2019-10-10 19:50:26
这里的问题是TestContainers。目前,@TestContainers注解将不会被继承(有一个open issue对此进行了修改,似乎会在下一个版本中得到修复)。作为变通方法,您可以使用@TestContainers注释父类和测试类,直到它被修复。
要使用junit5,您将需要org.testtainers:junit-jupiter依赖项以及testcontainers依赖项本身。jupiter one将为您的项目添加junit5扩展。
据我所知,kotlintest正在使用junit5作为测试器?所以它应该也能正常工作。
编辑:这个问题现在已经修复了。因此,您只需要用@TestContainers注释父类
https://stackoverflow.com/questions/57972025
复制相似问题