在Akka测试演员

lit*_*ito 29 scala akka scalatest

当我运行测试actor的基础示例时:

class MySpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender
  with WordSpec with MustMatchers with BeforeAndAfterAll {
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

class WordSpec needs to be a trait to be mixed in
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

1es*_*sha 39

在ScalaTest 2.0中,您可以找到类和特征WordSpec.名为WordSpecand trait 的类是WordSpecLike.所以只需使用WordSpecLike而不是WordSpec:

class MySpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender
  with WordSpecLike with MustMatchers with BeforeAndAfterAll {
Run Code Online (Sandbox Code Playgroud)


aba*_*yuk 7

除了1esha提出的内容之外,还有一个akka文档中的解决方案

如果由于某种原因从TestKit继承是一个问题,因为它是一个具体的类而不是一个特征,那就是TestKitBase:

import akka.testkit.TestKitBase

class MyTest extends TestKitBase {
  implicit lazy val system = ActorSystem()

  // put your test code here ...

  shutdown(system)
}
Run Code Online (Sandbox Code Playgroud)

隐式lazy val系统必须完全相同地声明(当然你可以根据需要将参数传递给actor系统工厂),因为特性TestKitBase在构造过程中需要系统.