如何模拟akka演员进行单元测试?

时间:2018-04-12 10:18:53

标签: scala playframework akka specs2 akka-testkit

@Singleton
class EventPublisher @Inject() (@Named("rabbit-mq-event-update-actor") rabbitControlActor: ActorRef)
(implicit ctx: ExecutionContext) {

def publish(event: Event): Unit = {
         logger.info("Publishing Event: {}", toJsObject(event), routingKey)
         rabbitControlActor ! Message.topic(shipmentStatusUpdate, routingKey = "XXX")
 }
}

我想编写一个单元测试来验证是否调用了这个publish函数

  

rabbitControlActor! Message.topic(shipmentStatusUpdate,routingKey =“XXX”)

只被调用一次。 我正在使用spingo向Rabbit MQ发布消息。 我使用Playframework 2.6.x和scala 2.12

2 个答案:

答案 0 :(得分:0)

您可以使用

创建TestProbe actor
val myActorProbe = TestProbe()

并使用myActorProbe.ref

获取其参考号

之后,您可以验证它只收到一条消息:

myActorProbe.expectMsg("myMsg")
myActorProbe.expectNoMsg()

您可能应该查看此页面:https://doc.akka.io/docs/akka/2.5/testing.html

答案 1 :(得分:0)

这取决于您只想检查该actor收到的消息,或者您想要测试该actor的功能。 如果你想检查传递给演员的消息,你可以使用TestProbe。即。

val probe = TestProbe()
probe.ref ! Message

然后做:

probe.expectMsg[Message]

如果您有主管演员,您可以使用TestActorRef,它正在执行一些数据库操作,因此您可以超越其接收方法并停止流程直到DB。 即。

val testActor =new TestActorRef(Actor.props{
override receive :Receive ={
case m:Message => //some db operation in real flow 
//in that case you can return what your actor return from the db call may be some case class. 
case _ => // do something }})

假设您的方法返回Boolean的Future。

val testResult=(testActor ? Message).mapTo[boolean]
//Then assert your result