【问题标题】:Unit Testing Components that Uses an Akka Actor使用 Akka Actor 的单元测试组件
【发布时间】:2018-03-10 23:57:39
【问题描述】:

首先,我不是在问如何对 Akka Actor 进行单元测试。我知道这样做的技巧。我的问题略有不同。

我正在开发一个不使用 Akka Actors 的 Scala 程序,我们称之为client。但是,该程序使用了一个库,我们称之为server,它的接口是使用 Akka Actor 实现的。

然后,通过询问模式clientserver 交互。

// This is the client program
class Client(uri: String) {
  implicit val context: ActorSystem = ActorSystem("client-actor-system")
  private val mainActor = context.actorSelection(uri)

  def connect: Future[SomeClass] = {
    implicit val timeout: Timeout = Timeout(5 seconds)
    (mainActor ? Connect()).mapTo[CreationResponse]
  }
}

现在,我想为Client 类写一些单元测试。单元测试意味着单独测试一个类。每个外部依赖项都应该被模拟。

如何在 Client 类中模拟对 mainActor 的引用?如何在演员系统中为mainActor 注入一个模拟演员?

提前致谢。

【问题讨论】:

    标签: scala unit-testing akka akka-testkit


    【解决方案1】:

    我会将 mainActor 演员选择注入客户端,并使用 Akka TestKits 创建它。

    当然,您需要ActorSelection,而不是ActorRef。可以在这里找到一些解决方案:

    Giving an ActorPath for a testProbe

    或者,您可以通过向ActorSelection 发送Identify 消息来将mainActor 设为ActorRef

    【讨论】:

    • 我想你的方法是正确的,也是唯一的。我唯一不喜欢的是 Akka 的使用不再隐藏在 Client 类中。
    • 另一种方法是创建一个工厂方法来构建你的actor,并在测试中覆盖它以返回probe.ref
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 2013-05-23
    • 2019-02-12
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多