scala - 为什么我在 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() 具有“较弱的访问权限”是什么意思?
解决方案
Scala 中的 Mixin 是从右到左扫描的。这就是为什么在您的代码有效的情况下,在其他特征之前调用 DatabaseFixture。
因此,在 DatabaseFixture 之前使用 withFixture 方法之前有一些其他特征(TestSuite)时,它试图覆盖它“较弱的访问权限”,这正是它所说的。例如,您不能用私有覆盖公共方法。它必须具有相同或更高的优先级(在您的情况下,公共 > 受保护。)
推荐阅读
- java - Android:NFC 为 onTagDiscovered 线程构建监听器
- c# - (int) 对象解析给出“对象引用未设置为对象的实例”异常
- vba - 如何使用 CodeBlocks IDE 中生成的 .exe 在 VBA 代码中运行 CreateObject()
- python - 如何删除 tkinter 文本框末尾的空白行?
- video - 使用 FFmpeg 修剪视频并在其上添加回旋镖效果
- windows - 我需要创建一个独立的服务来检测和执行自定义 Windows 热键
- java - Spring Boot 应用程序启动后失败 - 尝试调用不存在的方法。尝试是从以下位置进行的
- reactjs - 有没有办法在反应中返回多个firebase方法
- laravel - 使用数据透视从另一个表中获取所有记录
- c# - 使用 XDocument 将 XML 文件转换为文本文件