问题描述
我在Java项目中使用了akka actor,在编写相同的单元测试时遇到了困难。我已经编写了以下示例代码来说明我的用例。
MainActor
是一种控制器参与者,它接收akka消息,但不会对发送者做出任何响应。它将向初始化过程中创建了ActorRef
的其他参与者发送相同或不同的消息。
package sample;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
public class MainActor extends AbstractActor {
private final ActorSystem actorSystem;
private final ActorRef subActor1;
private final ActorRef subActor2;
public MainActor(ActorSystem actorSystem) {
this.actorSystem = actorSystem;
subActor1 = this.actorSystem.actorOf(Props.create(SubActor1.class));
subActor2 = this.actorSystem.actorOf(Props.create(SubActor2.class));
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(InitSubActor1.class,msg -> {
subActor1.tell(msg,self());
})
.match(InitSubActor2.class,msg -> {
subActor2.tell(msg,self());
})
.build();
}
public static class InitSubActor1 {
}
public static class InitSubActor2 {
}
}
SubActor1:
package sample;
import akka.actor.AbstractActor;
public class SubActor1 extends AbstractActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(MainActor.InitSubActor1.class,msg -> {
System.out.println("Received InitSubActor1");
})
.build();
}
}
SubAcotor2:
package sample;
import akka.actor.AbstractActor;
public class SubActor2 extends AbstractActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(MainActor.InitSubActor2.class,msg -> {
System.out.println("Received InitSubActor2");
})
.build();
}
}
如上所示,当MainActor
收到类型为MainActor.InitSubActor1
的消息时,它将发送给SubActor1
,并且当接收到类型为MainActor.InitSubActor2
的消息时也会发生类似的情况。 / p>
现在,我想为MainActor
编写单元测试,以便当我从单元测试发送MainActor.InitSubActor1
消息时,我想断言MainActor
将其发送到SubActor1
。
我尝试探索TestProbe
,发现如果演员响应发件人,我们可以验证演员消息,但是我找不到一种方法来验证演员将消息发送给另一个演员而不是发送者演员的情况。
下面是我尝试过的单元测试。
package sample;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.testkit.TestProbe;
import akka.testkit.javadsl.TestKit;
import org.junit.Test;
import static org.mockito.Mockito.spy;
public class MainActorTest {
private ActorSystem actorSystem = spy(ActorSystem.create());
@Test
public void testActor() {
new TestKit(actorSystem) {
{
final TestProbe probe = TestProbe.apply(actorSystem);
final Props props = Props.create(MainActor.class,actorSystem);
final ActorRef mainActor = actorSystem.actorOf(props);
mainActor.tell(new MainActor.InitSubActor1(),getRef());
probe.expectMsgClass(MainActor.InitSubActor1.class);
}
};
}
}
此操作失败,因为MainActor
实际上并未回复发件人。我猜这不适合我要测试的用例。
请让我知道是否有任何方法可以编写单元测试来验证发送给不同参与者的akka消息。
注意:我无法将ActorRef
和SubActor1
的{{1}}传递给SubActor2
的构造函数
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)