假设我有一个这样的演员(使用带有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。处理这种情况的最佳做法是什么?我只是想确保邮件被发送,但我不知道该怎么做。
谢谢, 迈克尔
答案 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)
如果你抽象出合作演员的创作,那么你可以注入一个做任何你想做的测试演员。这种情况与测试普通对象之间的协作非常相似。