我试图在这里介绍尽可能简单的变化问题.. 我写了一个单元测试,作为代码的副作用,创建了一个单独的actor。在他的preStart方法中,他通过调用 startJobCoordinator 方法创建其他单例actor。
private boolean startJobCoordinator(JobConfiguration jobConfiguration) throws InterruptedException {
ActorRef jobRef = createSingletonActor(Props.create(JobCoordinator.class, jobConfiguration.getId()), jobConfiguration.getId());
jobRef.tell("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", self());
TimeUnit.SECONDS.sleep(1);
return true;
}
private ActorRef createSingletonActor(Props props, final String name) {
final ClusterSingletonManagerSettings settings = ClusterSingletonManagerSettings.create(getContext().system());
getContext().actorOf(ClusterSingletonManager.props(props, PoisonPill.getInstance(), settings), name);
ClusterSingletonProxySettings proxySettings = ClusterSingletonProxySettings.create(getContext().system());
return getContext().actorOf(ClusterSingletonProxy.props("/user" + name, proxySettings), name + "Proxy");
}
现在,在类型为AbstractActor的JobCoordinator单例actor中,我编写了一个 receive 方法,如下所示:
match(String.class, System.err::println).build();
在单元测试中,未收到“ DDDDDDDDDDDDDDDDDDDDD ”消息(并且未打印)。
当作为运行整个系统的一部分运行相同的代码时,JobCoordinator actor获取消息。 当我将JobCoordinator创建为常规actor而不是单身时,他会得到消息(即使是单元测试的一部分)。
我真的很无能......任何帮助都会非常感激。
答案 0 :(得分:0)
问题是我在测试中使用JMock来模拟JobCoordinator(由不同的测试使用,但注释也影响了这个测试)。