在所有之前初始化测试容器中的容器
Posted
技术标签:
【中文标题】在所有之前初始化测试容器中的容器【英文标题】:initialize container in test container before before all 【发布时间】:2021-03-24 06:09:13 【问题描述】:我尝试使用test container
编写一组测试。测试容器需要在测试类主体中初始化覆盖val container = PostgreSQLContainer()
。我想做一组测试,这些测试将与插入数据库的准备好的测试数据一起工作。我尝试使用org.scalatest
中的beforeAll
,但它在初始化容器之前执行并且有一个NPE。您能否重写代码以获取正确插入的测试数据。
class mysqlSpec extends FlatSpec with ForAllTestContainer with BeforeAndAfterAll
override val container = MySQLContainer()
override protected def beforeAll(): Unit =
super.beforeAll()
Class.forName(container.driverClassName)
val connection = DriverManager.getConnection(container.jdbcUrl, container.username, container.password)
// insert some records
"Mysql container" should "be started" in
Class.forName(container.driverClassName)
val connection = DriverManager.getConnection(container.jdbcUrl, container.username, container.password)
val prepareStatement = connection.prepareStatement("select 1")
// check the records
【问题讨论】:
TestContainersScala 提供了afterStart
和 beforeEnd
方法,因此您可以这样做。
【参考方案1】:
我认为你以错误的顺序混合了这些特征。试试BeforeAndAfterAll with ForAllTestContainer
而不是ForAllTestContainer with BeforeAndAfterAll
。
这两个特征都覆盖run
方法并在此过程中调用super.run
。如果你使用ForAllTestContainer with BeforeAndAfterAll
,你的类将从BeforeAndAfterAll
继承run
方法,它会调用beforeAll
,然后调用super.run
,意思是ForAllTestContainer
的run
实现,这将启动容器。但是你需要它反过来,这里的顺序是由with
子句的顺序控制的。
关于为什么实现继承是一个坏主意还有其他问题吗?
【讨论】:
以上是关于在所有之前初始化测试容器中的容器的主要内容,如果未能解决你的问题,请参考以下文章
Spring 是不是在容器初始化其过滤器之前设置应用程序上下文?