测试传出的Akka演员消息

时间:2013-01-15 15:49:38

标签: unit-testing scala akka actor

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

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()左右,因为它会被发送到另一个actor。处理这种情况的最佳做法是什么?我只是想确保邮件被发送,但我不知道该怎么做。

谢谢, 迈克尔

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

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

或者您可以使用像Camel这样的内容来执行所有消息发送和截取消息。

答案 2 :(得分:0)

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