3

我对 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 演员中实现依赖注入?

提前致谢。

4

1 回答 1

4

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

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

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

那么,如何注入呢?

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

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

第三种情况可能是您正在查看的(我根据演员类的名称猜测):

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");
于 2012-11-15T20:46:31.987 回答