Unit testing 测试传出的Akka Actor消息

Unit testing 测试传出的Akka Actor消息,unit-testing,scala,akka,actor,Unit Testing,Scala,Akka,Actor,假设我有一个这样的演员(使用Akka 2.1和Scala 2.10): 因此,现在当客户端接收到Connect消息时,它会将其发送到ConfigurationManager,并进入不同的状态。这很好,但现在我想测试一下 val clientRef = TestActorRef(new ClientActor). clientRef ! new Connect // ?? 我不能在这里预期msg()左右,因为它将被发送给其他参与者。处理这种情况的最佳做法是什么?我只是想确保消息被发送出去,但我不

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

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

val clientRef = TestActorRef(new ClientActor).
clientRef ! new Connect
// ??
我不能在这里预期msg()左右,因为它将被发送给其他参与者。处理这种情况的最佳做法是什么?我只是想确保消息被发送出去,但我不知道怎么做

谢谢,
Michael

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


或者,您可以使用类似Camel的方法来完成所有消息的发送和截获。

如果您抽象出协作参与者的创建,那么您可以插入一个执行任何操作的测试参与者。这种情况非常类似于测试普通对象之间的协作。

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

正常代码:

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")

哦,这并不是因为我信任消息传递,而是因为我更想确保流是正确的。如“如果处于断开连接状态且连接消息到达”->验证参与者是否将消息发送给其他参与者..那么是否有关于如何执行此操作的最佳实践模式?将其他参与者作为构造函数参数传递进来。或者将创建分析到mixin中,然后在制作和测试中集合不同的具体演员是的——德里克·怀亚特的书(Akka Concurrency)中有很多这样的例子。感谢我一直在寻找的。我想我将添加一个默认构造函数和一个显式提供它的构造函数。问题是这一个参与者应该由正在使用的应用程序构造,我不希望它强制添加它不应该知道的“内部状态参与者”!
val clientActor = 
  system.actorOf(Props(new ClientActor(testActor)), "clientActor")