我有一個演員FooActor
通過Props
實例化幾個BarActor
s併發送BarMessage
s到它。代碼有效,但我很難爲它編寫測試。額外的限制是我只能在這個應用程序中使用Java代碼,沒有Scala代碼。如何測試Actor Foo向新創建的子actor的Bar發送消息?
多次嘗試後,這似乎是到目前爲止我最大的努力:
@Test
public void testJavaTestKit() {
new JavaTestKit(system) {{
JavaTestKit probe = new JavaTestKit(system);
// pretending that the probe is the receiving Bar, by returning it in the Props
Props barActorProps = Props.create(BarActor.class, new Creator() {
@Override
public Object create() {
return probe.getRef();
}
});
Props props = Props.create(FooActor.class, barActorProps);
ActorRef subject = system.actorOf(props);
Object msg = // basically irrelevant, will trigger Bar instantiation and message sending
subject.tell(msg, probe.getRef());
expectMsgClass(Bar.BarMessage.class);
expectNoMsg();
}};
}
這一切都似乎是有道理的我,但即使我能看到的消息發送到新創建的Bar
情況下,第一個斷言失敗。我究竟做錯了什麼?
更新:
,使得從阿卡文檔例如,這不同的東西,是我不想通過接收消息的現有演員。相反,我想通過用於創建子actor的實例的Props
。在測試中,我想讓我的probe
接收消息給那些新創建的演員。這就是爲什麼我添加Props.create
構造,應始終返回相同的探測器參與者。剛纔我在Creator.create
API中看到這條評論:
此方法在每次調用時都必須返回一個不同的實例。
所以這顯然不起作用,因爲它正是我想要的。所以我的一般問題仍然存在:我如何測試發送給新創建的子actor的消息?
探測器JavaTestKit ActorRef您希望發送消息的位置?如果是這樣,您需要調用probe.expectMsgClass,目前您在測試方法中針對匿名JavaTestKit進行斷言。除非你的測試「主題」用Bar.BarMessage.class回覆,那麼該斷言總是會失敗 – nickebbitt 2014-09-24 20:06:16
解決方案可能與將斷言更改爲'probe.expectMsgClass(Bar.BarMessage.class);' – nickebbitt 2014-09-24 20:10:54
感謝您的回答。這看起來很有前途,它可能使我更接近解決方案,儘管目前它還沒有工作。 – 2014-09-25 09:07:47