Akka Typed -如何将终止消息发送到BehaviorTestKit

sxpgvts3  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(166)

我正在尝试对我的参与者对一个子参与者的“Terminated”消息的处理进行单元测试。测试代码如下所示:

case Terminated(terminatedActor) =>
      val actorName = terminatedActor.path.name
      if (actorName.startsWith("ChildActor")) {
        doSomething()
      }
      Behaviors.same

在我的单元测试中,我尝试做的事情如下:

val testInbox = TestInbox[ParentActor.Request](name = "ChildActor1")
    val testKit = BehaviorTestKit(ParentActor())
    testKit.run(Terminated(testInbox.ref))
    assert(***that doSomething() happened***)

单元测试代码无法编译。我在调用www.example.com()时遇到以下错误testKit.run:
类型不匹配;找到:akka.actor.类型化.终止要求:ParentActor.Request
我假设这是因为Terminated消息没有从ParentActor.Request特征继承。
根据下面的注解,我将单元测试更改为:

val testInbox = TestInbox[ParentActor.Request](name = "ChildActor1")
    val testKit = BehaviorTestKit(ParentActor())
    testKit.signal(Terminated(testInbox.ref))
    assert(***that doSomething() happened***)

现在编译了,但是对testKit.signal()的调用现在抛出了一个DeathPactException,文档说这意味着参与者没有处理Terminated消息,尽管我的产品代码确实处理了它。
知道出什么事了吗?

6fe3ivhb

6fe3ivhb1#

您确定您的产品代码确实可以处理Terminated信号吗?
从类型化的Behavior的Angular 来看,信号不是消息。它们是由receiveSignal安装的信号处理程序处理的。该信号处理程序不仅接收信号,还接收ActorContext,并将其 Package 在一个元组中。如果对Terminated信号的响应不需要上下文,您仍然需要对其进行匹配:

// inside a .receiveSignal...
case (_, Terminated(terminatedActor)) =>
  val actorName = terminatedActor.path.name
  if (actorName.startsWith("ChildActor")) {
    doSomething()
  }
  Behaviors.same

请注意,Akka的测试套件包括此测试,该测试练习在通过testKit.signal发送时处理Terminated信号:

val other = TestInbox[String]()
      val testkit = BehaviorTestKit[Parent.Command](Parent.init)
      noException should be thrownBy {
        testkit.signal(Terminated(other.ref))
      }

相关问题