首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试akka.testkit.TestKit中的消息转发

测试akka.testkit.TestKit中的消息转发
EN

Stack Overflow用户
提问于 2019-02-04 02:36:18
回答 1查看 105关注 0票数 0

我想测试以下场景:

假设我有一个父角色,它创建了两个子角色,如下所示。

代码语言:javascript
复制
class A extends Actor {
  def getActorOf(props: Props) = {
    context.actorOf(props, props.clazz.getTypeName)
  }

  def receive: Receive = {
    case "ping" => {
      val bChild = getActorOf(Props[B])
      val cChild = getActorOf(Props[C])
      Seq(bChild, cChild)
        .foreach(child => child ! "ping forwarded")
    }
  }
}

我想测试一下,如果父母获得了'ping',他会向自己的两个孩子发送'ping forwarded'‘消息。

使用TestKit可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-04 03:04:37

也许是这样的吧?

代码语言:javascript
复制
 class TestMe extends A {
   val (probeB, probeC) = (TestProbe(), TestProbe())
   override def getActorOf(props: Props) = props match {
     case Props(_, classOf[B], _) => probeB.ref
     case Props(_, classOf[C], _) => probeC.ref
   }
 }

 val fixture = TestActorRef[TestMe](Props[TestMe])
 fixture ! "ping" 
 fixture.underlyingActor.probeB.expectMsg("ping forwarded")
 fixture.underlyingActor.probeB.expectMsg("ping forwarded")

就我个人而言,只要有可能,我更喜欢一种更“传统”的方法:

代码语言:javascript
复制
 trait Forwarder {
   def startAndForward[T : ClassTag](message: Any)(implicit context: ActorContext) = {
     val actor = context.actorOf(Props[T])
     actor ! message
     actor
  }
}
object Forwarder extends Forwarder

 class A(f: Forwarder = Forwarder) extends Actor {

   def receive: Receive = {
     case m@"ping" => 
       f.startAndForward[B]("ping forwarded")     
       f.startAndForward[C]("ping forwarded")
       sender ! "pong"
   }
 }

现在,您可以以简单的方式运行测试:

代码语言:javascript
复制
 val fwd = mock[Forwarder]
 val fixture = context.actorOf(Props(new A(fwd)))
 fixture.ask("ping").futureValue shouldBe "pong"
 verify(fwd).startAndForward[B](ArgumentMatchers.eq("ping forwarded"))(any, any)
 verify(fwd).startAndForward[C](ArgumentMatchers.eq("ping forwarded"))(any, any)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54506195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档