0
javaのAkka Actorをテストしようとしています。テストがしようとしているものです。コードはAkkaのアクタが生きていて、イベントストリームに登録されていることを確認する方法
です。- このテスト対象のアクターは、コンストラクタ内の偶数ストリームにサブスクライブします。
- アクターは、アクターシステム上のnormal actorOfを使用してテストで作成されます。
- これはActorRefを返しますが、実際のアクターはシーンの背後に非同期で作成されています。
- テストでイベントストリームにメッセージを公開します。
- しかし、アクターは非同期に構築されるため、メッセージはアクターがイベントストリームにサブスクライブする前にイベントストリームにパブリッシュされます。
- 結果:テスト対象のアクタはメッセージを見ることはありません。また、nerverはメッセージを転送するアクタに転送します。テストに失敗するのは、転送先の俳優がこのテストでメッセージが届くことを期待するテストプローブであるためです。
メッセージをイベントストリームにパブリッシュする前に眠ったり、少し待ったりできますが、アクターが完全に起動していることを確認するための「クリーンな」方法はありませんか?俳優が自分自身の作成を完了したことを示すイベントストリームのイベントを聞くことはできますか?
@Test
public void testListenOnEventStreamAndForward() throws InterruptedException
{
// given
final TestProbe actorToForwardMessageTo = new TestProbe(this.actorSystem);
final Function<ActorRefFactory, ActorRef> actorToForwardMessageTosFactoryFunction = (actorRefFactory) -> actorToForwardMessageTo.ref();
this.actorSystem.actorOf(Props.create(ActorUnderTest.class,() -> new ActorUnderTest(actorToForwardMessageTosFactoryFunction)));
//The test is green, depending on the whether we sleep here or not
//Thread.sleep(1000);
// when
this.eventStream.publish("someStringMessageTheActorUnderTestShouldPickUp");
// then
actorToForwardMessageTo.expectMsg("someStringMessageTheActorUnderTestShouldPickUp");
}
private static class ActorUnderTest extends AbstractActor
{
public ActorUnderTest(final Function<ActorRefFactory, ActorRef> actorToForwardMessageToFactoryFunction) throws Exception
{
context().system().eventStream().subscribe(self(), String.class);
final ActorRef actorToForwardMessageTo = actorToForwardMessageToFactoryFunction.apply(getContext());
receive(ReceiveBuilder
.match(
String.class,
stringMessage -> actorToForwardMessageTo.tell(stringMessage, self()))
.matchAny(
message -> unhandled(message))
.build());
}
}
あなたのテストで 'resolveOne'関数を使うとどうなりますか? – rethab
私が間違っていないと、resolveOneはactorPathで動作します。私はactorRefしか利用できません。 –