我正在尝试为我的一个演员编写单元测试,该演员使用TestKit从AbstractPersistentActorWithAtLeastOnceDelivery派生。我需要使用TestActorRef.create(...)创建一个actor,因为我需要获取一个bottomActor,以便将模拟注入到actor的实现中。
我的(简化)演员
public class MyActor extends AbstractPersistentActorWithAtLeastOnceDelivery {
@Override
public Receive createReceive() {
return receiveBuilder().match(String.class, message -> {
persist(new MessageSent(message), event -> updateState(event));
}).match(ConfirmMessage.class, confirm -> {
persist(new MessageConfirmed(confirm.deliveryId), event ->
updateState(event));
}).matchAny(message -> log.info("Received unexpected message of class {}.
Content: {}", message.getClass().getName(), message.toString())).build();
}
void updateState(Object received) {
if (received instanceof MessageSent) {
final MessageSent messageSent = (MessageSent) received;
ActorRef destinationActor =
findDestinationActor(messageSent.messageData);
deliver(actorSystem.actorSelection(destinationActor.path()),
deliveryId -> new Message(deliveryId, messageSent.messageData));
} else if (received instanceof MessageConfirmed) {
final MessageConfirmed messageConfirmed = (MessageConfirmed) received;
confirmDelivery(messageConfirmed.deliveryId);
}
}
单元测试:
@Test
public void actorTest() {
ActorSystem system = ActorSystem.create();
TestKit probe = new TestKit(system);
TestActorRef<myActor> testActor = TestActorRef.create(system, props,
probe.getRef());
MyActor myActor = testActor.underlyingActor();
injectMocks(myActor); // my method
testActor.tell("testMessage", probe.getRef());
List<Object> receivedMessages = probe.receiveN(1, FiniteDuration.create(3,
TimeUnit.SECONDS));
}
在调试器中,我看到updateState()中的deliver()方法被调用,但单元测试失败并出现错误:
断言失败:超时(3秒),同时期待1条消息(得到0)
我想知道是否可以使用TestKit测试通过TestActorRef创建的actor,以及我的actor扩展AbstractPersistentActorWithAtLeastOnceDelivery与测试失败有关的事实
答案 0 :(得分:0)
无法将TestActorRef
与Akka持久性一起使用。它有时会起作用,但通常会以您在问题中描述的方式失败。 TestKit的其他功能与Akka持久性一起正常工作。
请参阅https://doc.akka.io/docs/akka/current/testing.html#synchronous-testing-testactorref下的警告:
警告
由于TestActorRef的同步特性,它不能与Akka提供的一些支持特性一起使用,因为它们需要异步行为才能正常运行。与test actor ref不能很好混合的特征示例是Akka Persistence提供的PersistentActor和AtLeastOnceDelivery。