在所有之前初始化测试容器中的容器

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 提供了 afterStartbeforeEnd 方法,因此您可以这样做。 【参考方案1】:

我认为你以错误的顺序混合了这些特征。试试BeforeAndAfterAll with ForAllTestContainer 而不是ForAllTestContainer with BeforeAndAfterAll

这两个特征都覆盖run 方法并在此过程中调用super.run。如果你使用ForAllTestContainer with BeforeAndAfterAll,你的类将从BeforeAndAfterAll继承run方法,它会调用beforeAll,然后调用super.run,意思是ForAllTestContainerrun实现,这将启动容器。但是你需要它反过来,这里的顺序是由with子句的顺序控制的。

关于为什么实现继承是一个坏主意还有其他问题吗?

【讨论】:

以上是关于在所有之前初始化测试容器中的容器的主要内容,如果未能解决你的问题,请参考以下文章

一个测试容器用于多个测试

Spring 是不是在容器初始化其过滤器之前设置应用程序上下文?

带有测试容器的未终止美元报价初始化脚本

Mybatis在spring容器中的初始化过程

经过测试,chrome 进程仍然在 Docker 容器中的 Laravel Dusk

STL----Set