【问题标题】:How to wait for all actors to process their inboxes in a test如何在测试中等待所有参与者处理他们的收件箱
【发布时间】:2019-04-13 10:31:14
【问题描述】:

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

由于 actor 可能只改变其内部状态,而不会向外界发出已收到消息的信号,因此我必须找到另一种方法等到消息处理完毕。

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

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

【问题讨论】:

    标签: testing akka akka-testkit akka-typed


    【解决方案1】:

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

    您可以像这样在 Akka Typed 中为您的测试参与者系统配置它:

    val config = ConfigFactory.parseString(
        """akka.actor.default-dispatcher =
            { type = akka.testkit.CallingThreadDispatcherConfigurator }"""
    )
    
    val testKit = ActorTestKit(ActorTestKitBase.testNameFromCallStack(), config)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2022-01-13
      • 2016-04-01
      • 2015-03-22
      • 1970-01-01
      • 2015-12-28
      • 2012-05-05
      相关资源
      最近更新 更多