我正在尝试对我的参与者对一个子参与者的“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消息,尽管我的产品代码确实处理了它。
知道出什么事了吗?
1条答案
按热度按时间6fe3ivhb1#
您确定您的产品代码确实可以处理
Terminated
信号吗?从类型化的
Behavior
的Angular 来看,信号不是消息。它们是由receiveSignal
安装的信号处理程序处理的。该信号处理程序不仅接收信号,还接收ActorContext
,并将其 Package 在一个元组中。如果对Terminated
信号的响应不需要上下文,您仍然需要对其进行匹配:请注意,Akka的测试套件包括此测试,该测试练习在通过
testKit.signal
发送时处理Terminated
信号: