0
@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函数是否被调用

兔子控制演员!Message.topic(shipmentStatusUpdate, routingKey = "XXX")

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

4

2 回答 2

0

这取决于您是否只想检查该参与者收到的消息,或者您想测试该参与者的功能。如果您想检查消息是否已传递给演员,您可以使用 TestProbe。IE

val probe = TestProbe()
probe.ref ! Message

然后做 :

probe.expectMsg[Message]

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

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

假设您的方法返回布尔值的未来。

val testResult=(testActor ? Message).mapTo[boolean]
//Then assert your result
于 2018-04-12T19:21:05.963 回答
0

你可以创建一个TestProbe演员:

val myActorProbe = TestProbe()

并得到它的参考myActorProbe.ref

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

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

你可能应该看看这个页面:https ://doc.akka.io/docs/akka/2.5/testing.html

于 2018-04-12T13:32:07.600 回答