【问题标题】: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 方法,因此您可以这样做。

标签: scala scalatest testcontainers


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 2021-05-19
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2021-05-21
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多