代码之家  ›  专栏  ›  技术社区  ›  Łukasz Rzeszotarski

在akka.testkit.testkit中测试消息转发

  •  0
  • Łukasz Rzeszotarski  · 技术社区  · 7 年前

    我想测试以下场景:

    假设我有一个父角色,它创建了两个这样的子角色。

    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执行此操作?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dima    7 年前

    也许是这样的?

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

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

    现在,您可以直接运行测试:

     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)
    
    推荐文章