@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
。
答案 0 :(得分:0)
您可以使用
创建TestProbe
actor
val myActorProbe = TestProbe()
并使用myActorProbe.ref
之后,您可以验证它只收到一条消息:
myActorProbe.expectMsg("myMsg")
myActorProbe.expectNoMsg()
答案 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