首页 > 解决方案 > 为什么我在 scalatest 套件中混合 TestSuiteMixIn 特征的顺序很重要?

问题描述

我创建了以下固定装置:

trait DatabaseFixture extends TestSuiteMixin { this: TestSuite =>

    // Just setting up a test database
    val cpds = new ComboPooledDataSource
    val url : URL = getClass.getResource( "c3p0.properties" )
    val db = Database.forDataSource(cpds, Some(50))
    val users = Schema.users
    val instances = Schema.instances

    Await.result(db.run( DBIO.seq(
        users.schema.create,
    ) ), 3 seconds )

    abstract override def withFixture(test: NoArgTest): Outcome = {
        try super.withFixture(test)
        finally cpds.close()
    }
}

trait UserControllerFixture extends DatabaseFixture with ScalatraSuite { this: TestSuite =>
    addServlet( new UserController(db), "/user/*" )

    abstract override def withFixture(test: NoArgTest): Outcome = {
        super.withFixture( test )
    }
}

这是我将它们混合到测试套件中的第一种方式:

class UserControllerTestSuite extends DatabaseFixture with ScalatraSuite with FlatSpecLike with Matchers {

    "POST to /user/add" should "return 201 for created" in {

        post( "/instance/add" ) {
            status shouldBe  201
        }
    }

}

编译失败,出现以下错误:method withFixture in trait TestSuite of type (test: UserControllerTestSuite.this.NoArgTest)org.scalatest.Outcome has weaker access privileges; it should be public

但是,当我在其他 scalatest 特征之后混合固定装置时,它编译得很好:

class UserControllerTestSuite extends ScalatraSuite with FlatSpecLike with Matchers with DatabaseFixture {

    "POST to /user/add" should "return 201 for created" in {

        post( "/instance/add" ) {
            status shouldBe  201
        }
    }

}

这里发生了什么?withFixture() 具有“较弱的访问权限”是什么意思?

标签: scalaoverridingtraitsscalatestfixtures

解决方案


Scala 中的 Mixin 是从右到左扫描的。这就是为什么在您的代码有效的情况下,在其他特征之前调用 DatabaseFixture。

因此,在 DatabaseFixture 之前使用 withFixture 方法之前有一些其他特征(TestSuite)时,它试图覆盖它“较弱的访问权限”,这正是它所说的。例如,您不能用私有覆盖公共方法。它必须具有相同或更高的优先级(在您的情况下,公共 > 受保护。)


推荐阅读