如何使用模式管道测试演员

泽拉

我有一个演员,从启动器接收消息,然后询问工作人员,最后将结果发送给启动器。

在代码中更清楚:

public class MyActor extends UntypedActor {

    private final ActorRef worker;

    public MyActor(ActorRef worker) {
        this.worker = worker;
    }

    @Override
    public void onReceive(Object message) throws Exception {
        if ("initiate".equals(message)) {
            final ActorRef initiator = sender();
            final Future f = Patterns.ask(worker, "ask:"+message, Timeout.apply(3, TimeUnit.SECONDS));
            Patterns.pipe(f, context().system().dispatcher()).to(initiator);
        }
    }
}

现在尝试测试该演员。

我需要测试的内容(如果我错了,请纠正我):

1)当收到“发起”时,工作人员应收到“询问:发起”
2)当收到“响应”时,发起人应收到“响应工作”

并测试:

@Test
public void testIt() {
    new JavaTestKit(system) {
        {

            JavaTestKit initiator = new JavaTestKit(system);
            JavaTestKit worker = new JavaTestKit(system);

            final Props props = Props.create(MyActor.class, worker.getRef());
            final ActorRef subject = system.actorOf(props);

            subject.tell("initiate", initiator.getRef());

            worker.expectMsgEquals("ask:initiate");

            subject.tell("responseFromWorker", worker.getRef());

            //this fails
            initiator.expectMsgEquals("responseFromWorker");

        }
    };
}

升级

发起方未收到消息:

java.lang.AssertionError: assertion failed: timeout (3 seconds) during expectMsg while waiting for responseFromWorker

尽管我的演员代码正确:

static class Worker extends UntypedActor {

    @Override
    public void onReceive(Object message) throws Throwable {
        if (message.equals("ask:initiate"))
            sender().tell("responseFromWorker", self());
    }
}

static class Initiator extends UntypedActor {

    @Override
    public void onReceive(Object message) throws Throwable {
        if (message.equals("responseFromWorker"))
            System.out.println("Initiator receive responseFromWorker");
    }
}

@Test
public void noAkkaTestKit() {

    final ActorRef worker = system.actorOf(Props.create(Worker.class));

    final ActorRef initiator = system.actorOf(Props.create(Initiator.class));

    final ActorRef subject = system.actorOf(Props.create(MyActor.class, worker));

    subject.tell("initiate", initiator);

}

所以我做错了。如何正确测试JavaTestKit

吴忠林

因为Ask Future模式将创建一个新的actor来接收响应msg,所以代码

subject.tell("responseFromWorker", worker.getRef());

会将消息直接发送给主题,而不是该参与者。

您可以将msg发送到测试探针的最后一个msg发送者

我写了一个scala版本

import java.util.concurrent.TimeUnit

import akka.actor.{Props, Actor, ActorRef, ActorSystem}
import akka.pattern.{ask, pipe}
import akka.testkit.{TestProbe, ImplicitSender, TestKit}
import org.scalatest.{BeforeAndAfterAll, BeforeAndAfterEach, Matchers, WordSpecLike}

class MyActor(worker: ActorRef) extends Actor {
  import context.dispatcher
  override def receive: Receive = {
    case message@"initiate" =>
      val initiator = sender()
      println("received " + message)
      val f = ask(worker, "ask:" + message)(akka.util.Timeout(3, TimeUnit.SECONDS))
      f pipeTo initiator
    case msg =>
      println(msg)
  }
}

class ActorSpec extends TestKit(ActorSystem("MySpec"))
  with ImplicitSender with WordSpecLike with BeforeAndAfterAll with BeforeAndAfterEach with Matchers {
  val workerProbe = TestProbe()
  val initiatorProbe = TestProbe()

  val props = Props(new MyActor(workerProbe.ref))
  val subject = system.actorOf(props)

  subject.tell("initiate", initiatorProbe.ref)
  workerProbe.expectMsg("ask:initiate")
  workerProbe.sender.tell("responseFromWorker", workerProbe.ref)
  initiatorProbe.expectMsg("responseFromWorker")
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

akka:如何测试演员被阻止

如何测试演员Foo将消息发送到新创建的子演员Bar?

在Akka挂钩中创建测试演员(preStart)

如何测试Akka Persistence演员

如何测试向其他演员发送消息的Akka演员?

Scala测试,如何从演员那里取得结果

如何使用Akka演员的@Singleton?

包含CompositeDisposable的测试演示者

测试创建子演员的演员

如何使用jenkins管道发布dotnet核心测试?

如何在Akka演员的模式赛中尽早归来

对 /temp/$a 等演员使用带有询问模式的 actorSelection

如何模拟Akka演员对课程进行单元测试?

如何测试不向发送方发送任何内容的演员

使用Kotlin和Akka-TestKit测试Akka演员

如何使用actorSelection选择Akka演员?

如何使用Akka管理对顶级演员的引用

如何使用graphql-ruby测试GraphQL模式?

如何使用 Jest 的模式功能测试 redux-saga take?

如何使用 webdriverIO 在隐身模式下执行测试

在.NET中的UI测试自动化框架中实现剧本模式/演员模型

在MVP GWT应用程序中测试演示者

集成测试-此操作需要IIS集成管道模式

Azure 管道:如何保存 Visual Studio“测试结果”以与管道中的其他任务一起使用?

如何使用 Azure 进行身份验证以使用 python 运行数据工厂管道测试?

我如何从管道grep多个模式

Jenkins 管道 perfReport:使用“专家模式”约束

VSTS发布管道运行后如何测试?

如何从Azure发布管道配置Jmeter测试