在 Akka 中测试 Actor

Posted

技术标签:

【中文标题】在 Akka 中测试 Actor【英文标题】:Testing Actors in Akka 【发布时间】:2013-11-27 23:27:24 【问题描述】:

当我运行基本示例来测试演员时:

class MySpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender
  with WordSpec with MustMatchers with BeforeAndAfterAll 

我收到错误:

class WordSpec needs to be a trait to be mixed in

我做错了什么?

【问题讨论】:

【参考方案1】:

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

class MySpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender
  with WordSpecLike with MustMatchers with BeforeAndAfterAll 

【讨论】:

【参考方案2】:

除了1esha提出的,akka documentation还有一个解决方案

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

import akka.testkit.TestKitBase

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

  // put your test code here ...

  shutdown(system)

隐式惰性验证系统必须完全如此声明(您当然可以根据需要将参数传递给参与者系统工厂),因为 trait TestKitBase 在其构建过程中需要该系统。

【讨论】:

【参考方案3】:

从 Scalatest 2.0 开始,您混合的 Specs 现在是类而不是特征。这意味着您不能将它们与 Akka 的测试套件一起使用...两者都是类,您只能扩展其中一个。

切换到最新的 1.9.1。它仍然得到他们的支持,并且是在他们做出改变之前发布的最后一个版本,并为 akka 用户带来了破坏。在 1.9.1 中,规格仍然是特征。

【讨论】:

特征仍然存在并以Like 后缀命名。以WordSpecLike 为例 那么,这就是你上面需要的答案。在您的测试规范中添加“喜欢”一词。

以上是关于在 Akka 中测试 Actor的主要内容,如果未能解决你的问题,请参考以下文章

akka actor初探

Akka Java 文档 -- 容错

Scala 学习 并发编程模型Akka

通过简单的 akka-http 路由测试与演员陷入无限循环

Akka系列:Akka中的Actor系统

Scala框架Akka学习