我想监视我的actor实例,但不能简单地用new关键字创建。我想出了以下解决方案:
val testActorSpy = spy(TestActorRef(new TestActor).underlyingActor)
val testActorRef = TestActorRef(testActorSpy )
但这样我创造了一个不必要的演员。有没有更清洁的解决方案?
答案 0 :(得分:0)
所以我对Akka Actor系统的理解是你应该通过属性做到这一点然后呢?
因此,通过道具创建演员,并且在测试时只是将间谍返回给演员。
因此,这应该给你一个结果:
val testActorRef = TestActorRef(spy(new TestActor))
val testActorSpy = testActorRef.underlyingActor
请注意,重新启动actor时,basActor会被销毁。所以嘲笑这可能不是最好的选择。
如果直接使用actor而不是通过系统,你也可以测试一些东西并绕过线程化的底层系统。
请参阅this(java下面的代码粘贴)。
static class MyActor extends UntypedActor {
public void onReceive(Object o) throws Exception {
if (o.equals("say42")) {
getSender().tell(42, getSelf());
} else if (o instanceof Exception) {
throw (Exception) o;
}
}
public boolean testMe() { return true; }
}
@Test
public void demonstrateTestActorRef() {
final Props props = Props.create(MyActor.class);
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testA");
final MyActor actor = ref.underlyingActor();
assertTrue(actor.testMe());
}