Scala TestActorRef死锁可能性仍然相关吗?

Scala TestActorRef死锁可能性仍然相关吗?,scala,testing,akka,Scala,Testing,Akka,akka 2.3.9中有一条警告: 从TestProbe发送到运行在 如果另一个参与者 也可能发送到此探测器。TestProbe.watch的实现 TestProbe.unwatch还将向被观察者发送消息,这意味着 尝试从TestProbe观看例如TestActorRef是危险的 我试图在测试中使用TestProbe和TestActorRef再现所描述的死锁情况,因为这两种方法都使用callingreaddispatcher class DeadlockTest extends TestKit(

akka 2.3.9中有一条警告:

TestProbe
发送到运行在
如果另一个参与者
也可能发送到此探测器。
TestProbe.watch的实现
TestProbe.unwatch
还将向被观察者发送消息,这意味着 尝试从
TestProbe
观看例如
TestActorRef
是危险的

我试图在测试中使用
TestProbe
TestActorRef
再现所描述的死锁情况,因为这两种方法都使用
callingreaddispatcher

class DeadlockTest extends TestKit(ActorSystem()) with FunSuiteLike {
  test("deadlock attempt") {
    val b = TestProbe()
    val a = TestActorRef(new Actor {
      override def preStart() = b.ref ! "pre"
      def receive = {
        case msg =>
          sender ! msg
          context.stop(self)
      }
    })
    b.watch(a)
    b.send(a, "foo")
    b.expectMsg("pre")
    b.expectMsg("foo")
    b.expectTerminated(a)
    b.unwatch(a)
  }
}
我原以为测试会挂起,但它成功地通过了


警告是否仍然相关,死锁的可能性高还是过时了?

此警告所述的竞争条件是TestProbe设计中固有的,但遇到死锁的可能性很小,监视必须与向另一个方向发送消息完全同时发生,并且必须在不同的线程中发生。后者在极少数情况下可以观察到,这是由于顶级参与者的创建方式

所有这些都是相当棘手的,这些都不适用于为Akka类型编写和执行测试的方式,我期待着这是唯一使用的模式