Java 8 と Akka 2.12:2.5.16 こちら。私は、Akka TestKitを利用して初めての (これまでの) Akka 単体テストを作成しようとしていますが、オンラインで見つけた (非常に少ない) 例に見られる原則を適用するのに苦労しています。
私の俳優:
public class Child extends AbstractActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Init.class, init -> {
int workUnit = workService.doSomeWork();
log.info("Performed work on {}", workUnit);
}).build();
}
}
public class Master extends AbstractActor {
@Inject @Named("CHILD")
private ActorRef child;
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Init.class, init -> {
child.tell(init, self());
}).build();
}
}
とてもとてもシンプルです。Master
ここで、アクターがメッセージを受信したときに、Init
そのメッセージをアクターに転送することを確認する単体テストを作成したいと思いますChild
。これまでの私の最善の試み:
@RunWith(MockitoJUnitRunner.class)
public class MasterTest {
private ActorSystem actorSystem;
@Before
public void setup() {
actorSystem = ActorSystem.create("test-system");
}
@After
public void teardown() {
Duration duration = Duration.create(10L, TimeUnit.SECONDS);
TestKit.shutdownActorSystem(actorSystem, duration, true);
actorSystem = null;
}
@Test
public void onInit_shouldSendFordwardToChild() {
// Given
TestKit testKit = new TestKit(actorSystem);
ActorRef master = actorSystem.actorOf(Props.create(Master.class, testKit));
// When
master.tell(new Init(), ActorRef.noSender());
// Then
testKit.expectMsg(Init.class);
}
}
これを実行すると、次のようになります。
java.lang.IllegalArgumentException: no matching constructor found on class com.me.myapp.Master for arguments [class akka.testkit.TestKit]
TestKit
インスタンスを私のMaster
アクターに接続するのを手伝ってくれますMasterTest
か? 前もって感謝します!