0

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

演员是这样的:

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无法直接获取内部变量,请理解,使用silentActor.underlyingActor.internalState可以得到它。非常抱歉这个可怕的问题。

4

1 回答 1

1

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

如果您想为 ActorRef 上的特定变量和方法编写单元测试,您需要使用文档中描述的底层Actor 技术(及其警告) 。(参见 TestActorRef 部分。

于 2016-07-12T05:06:11.953 回答