在 akka testkit 中,为什么使用事件而不是普通方法获取 actor 状态?

In akka testkit,why use a event rather then a normal method get the actor state?

akka 的书中演员的第三章。它使用消息事件来测试无声演员的状态。

演员如下:

object SilentActorProtocol {
 case class SilentMessage(data: String)
 case class GetState(receiver: ActorRef)
}
class SilentActor extends Actor {
 import SilentActorProtocol._
 var internalState = Vector[String]()
 def receive = {
   case SilentMessage(data) =>
     internalState = internalState :+ data
     case GetState(receiver) => receiver ! internalState
   }
}

测试代码如下:

"change internal state when it receives a message, multi" in {
 import SilentActorProtocol._
 val silentActor = system.actorOf(Props[SilentActor], "s3")
 silentActor ! SilentMessage("whisper1")
 silentActor ! SilentMessage("whisper2")
 silentActor ! GetState(testActor)
 expectMsg(Vector("whisper1", "whisper2"))
}

在测试代码中为什么使用 GetState 获取上述 SilentMessage 事件的结果。
为什么不用slientActor.internalState直接得到结果呢?

更新

有些朋友好像误导了我的problem.For详情, 书上说

use the internalState variable will encounter concurrency problem, so there should use a GetState event tell actor to get the actor's inner state rather then use internalState straightly.

我不知道为什么会遇到并发问题,为什么使用GetState可以解决问题

解释一下

slientActor.internalState不能直接获取内部变量,直接用silentActor.underlyingActor.internalState可以获取it.So不好意思问了。

如果我没有理解你的问题,答案是测试代码中的silentActor不是actor,它是ActorRef实例,因此它没有internalState var被引用。

如果您想为 ActorRef 上的特定变量和方法编写单元测试,您需要使用 documentation 中描述的底层 Actor 技术(及其注意事项)。 (请参阅有关 TestActorRef 的部分。