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

时间:2016-07-12 03:22:33

标签: akka akka-testkit

在演员 akka 的第三章中。它使用消息事件来测试静默actor的状态。

演员如下:

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直接获得结果?

更新

有些朋友似乎误解了我的问题。 书中说

  

使用internalState变量会遇到并发问题,所以应该使用GetState事件告诉actor来获取actor的内部状态而不是直接使用internalState

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

解释

slientActor.internalState无法直接获取内部变量,instand,使用silentActor.underlyingActor.internalState就可以获得它。对于这个可怕的问题,我很抱歉。

1 个答案:

答案 0 :(得分:1)

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

如果要在ActorRef上为特定变量和方法编写单元测试,则需要使用documentation中描述的basActor技术(及其警告)。 (参见TestActorRef部分。