您的代码已经可以正确测试:
- 您可以单独测试您的业务逻辑,因为您可以实例化您
Helper
的演员外部
- 一旦你确定它
Helper
做了它应该做的事情,只需向演员发送一些输入并观察正确的回复回来
现在,如果您需要“模拟”Worker
来测试其他组件,根本不要使用 Worker,TestProbe
而是使用 a。你通常会得到ActorRef
Worker 的地方,只需注入probe.getRef()
.
那么,如何注入呢?
我假设您的其他组件是一个 Actor(因为否则您将不会遇到任何您通常使用的注入技术的问题)。然后是三个基本的选择:
- 将其作为构造函数参数传入
- 在消息中发送
- 如果参与者创建 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");