如何等待所有参与者在测试中处理他们的收件箱

时间:2019-04-13 10:31:14

标签: testing akka akka-testkit akka-typed

在异步(类型化的)actor测试中,我必须确保在发送下一条消息之前,actor已收到特定消息。这是必要的,因为消息可以通过几个子actor到达被测actor(直接发送消息时,无论如何都可以保证顺序)。

由于演员可能只更改其内部状态,而没有向外界发出已收到消息的信号,所以我必须找到另一种方法来等待消息被处理。

有没有办法等到所有收件箱都为空?我认为ManualTime.timePasses(0.seconds)可以胜任这项工作,但我不确定,这会大大降低我的测试速度。显然,我不想使用Thread.sleep(...),因为它不能真正保证所有消息都会得到处理,并且测试速度甚至会更慢。

我还尝试使用BehaviorInterceptor来确定主要演员何时收到消息,但这只有在我知道子演员发送给主要演员的消息时才有可能。在测试中,这实际上应该是透明的,所以我正在寻找一种通用方法来断言参与者是通过处理消息来完成的(因为我控制了调度程序,因此不会生成任何计时器消息)。

1 个答案:

答案 0 :(得分:0)

我发现这实际上很容易实现:CallingThreadDispatcher立即处理所有参与者消息,并且消息的传递和处理是确定性的。永远不必等待消息处理,因为在tell(或!)调用返回之前,消息已在测试线程中处理。

您可以在Akka Typed中为测试演员系统配置它,

val config = ConfigFactory.parseString(
    """akka.actor.default-dispatcher =
        { type = akka.testkit.CallingThreadDispatcherConfigurator }"""
)

val testKit = ActorTestKit(ActorTestKitBase.testNameFromCallStack(), config)