【问题标题】:How to properly test with mocks Akka actors in Java?如何在 Java 中使用模拟 Akka 演员进行正确测试?
【发布时间】:2012-11-14 22:28:36
【问题描述】:

我对 Akka 很陌生,我正在尝试用 Java 编写一些单元测试。考虑以下演员:

public class Worker extends UntypedActor {

  @Override
  public void onReceive(Object message) throws Exception {

    if (message instanceof Work) {
      Work work = (Work) message;
      Result result = new Helper().processWork(work);
      getSender().tell(result, getSelf());
    } else {
      unhandled(message);
    }
  }

}

拦截电话new Helper().processWork(work)的正确方法是什么?附带说明一下,有没有推荐的方法来使用 Java 在 Akka Actor 中实现依赖注入?

提前致谢。

【问题讨论】:

    标签: java unit-testing mocking akka


    【解决方案1】:

    您的代码已经可以正确测试:

    • 你可以单独测试你的业务逻辑,因为你可以在actor之外实例化你的Helper
    • 一旦你确定 Helper 做了它应该做的事情,只需向演员发送一些输入并观察正确的回复回来

    现在,如果您需要“模拟”Worker 来测试其他组件,根本不要使用 Worker,而是使用 TestProbe。在你通常会得到 Worker 的 ActorRef 的地方,只需注入 probe.getRef()

    那么,如何注入呢?

    我假设您的其他组件是一个 Actor(因为否则您将不会遇到任何您通常使用的注入技术的问题)。然后是三个基本的选择:

    1. 将其作为构造函数参数传入
    2. 在消息中发送
    3. 如果 actor 创建 ref 作为其子元素,则传入 Props,可能在替代构造函数中

    第三种情况可能就是你所看到的(我根据actor类的名称猜测):

    public class MyParent extends UntypedActor {
      final Props workerProps;
    
      public MyParent() {
        workerProps = new Props(...);
      }
      public MyParent(Props p) {
        workerProps = p;
      }
    
      ...
      getContext().actorOf(workerProps, "worker");
    }
    

    然后你可以像这样注入TestProbe

    final TestProbe probe = new TestProbe(system);
    final Props workerMock = new Props(new UntypedActorFactory() {
      public UntypedActor create() {
        return new UntypedActor() {
          @Override
          public void onReceive(Object msg) {
            probe.getRef().tell(msg, getSender());
          }
        };
      }
    });
    final ActorRef parent = system.actorOf(new Props(new UntypedActorFactory() {
      public UntypedActor create() {
        return new MyParent(workerMock);
      }
    }), "parent");
    

    【讨论】:

    • 一般来说,这是一种可靠的方法,但它确实有一个小问题:在某些情况下,父actor可能想要为子actor提供参数。在这种情况下,必须提供某种类型的 Props 工厂(而不是 Props 的实例) - 请注意此类工厂的可序列化性。
    猜你喜欢
    • 2012-07-12
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多