4

假设我有这样的演员(使用 Akka 2.1 和 Scala 2.10):

class ClientActor extends Actor with ActorLogging {

  val configurationManager = context.actorOf(Props[ConfigurationManager], "ConfigurationManager")

  def disconnected: Receive = {
    case msg: Connect => 
      configurationManager ! msg
      context.become(connecting)
  }

  ..

  def recieve = disconnected
}

所以现在当客户端收到一个 Connect 消息时,它会将它发送到 ConfigurationManager 并进入不同的状态。很好,但现在我想测试一下。

val clientRef = TestActorRef(new ClientActor).
clientRef ! new Connect
// ??

我不能在这里期待Msg() 左右,因为它将被发送给不同的演员。处理这种情况的最佳做法是什么?我只是想确保消息被发送,但我不知道该怎么做。

谢谢,迈克尔

4

3 回答 3

2

将依赖项作为构造函数参数传递:

正常代码:

val configActor = 
  system.actorOf(Props[ConfigurationManager], "configManager")

val clientActor = 
  system.actorOf(Props(new ClientActor(configActor)), "clientActor")

测试代码:

val clientActor = 
  system.actorOf(Props(new ClientActor(testActor)), "clientActor")
于 2013-01-16T03:30:05.957 回答
0

如果你抽象出协作actor的创建,那么你可以注入一个测试actor来做你想做的任何事情。这种情况与测试普通对象之间的协作非常相似。

于 2013-01-15T16:30:34.287 回答
0

也许您应该相信 Akka 内部的消息发送机制会像宣传的那样工作。如果你真的,真的不能相信这一点,那么最好的解决方案是下载 Akka 源代码,然后添加你自己的单元测试来覆盖你的用例,或者修改代码来支持你自己的单元测试需求。

或者你可以使用像 Camel 这样的东西来完成所有的消息发送和拦截消息。

于 2013-01-15T15:59:39.363 回答