我有一个actor,它将一个port绑定到preStart,然后期望Tcp.Bound消息。然后,它将仅等待Tcp.Connected发生。该演员没有为其创建者提供任何内容,因此我想接收Tcp消息和/或模拟Tcp管理器
到目前为止,我尝试将我的TestKit探针订阅到tcp消息。除此之外,我还想创建一个将覆盖管理器的类,但是仍然不知道该怎么做。我正在使用Java 8和JUnit5。
@Override
public void preStart() {
this.connection = Tcp.get(getContext().getSystem()).manager();
this.connection.tell(TcpMessage.bind(getSelf(), remoteAddress, 100), getSelf());
}
@Override
public AbstractActor.Receive createReceive() {
return receiveBuilder()
.match(Tcp.Bound.class, msg -> {
log.debug("Port Bound : [{}]", msg.localAddress());
this.sessionHandler = getContext().actorOf(RmiSessionHandler.props(getSelf(), settings));
this.buffer = getContext().actorOf(RmiBuffer.props(this.sessionHandler, settings));
this.connection = getSender();
}).match(Tcp.Connected.class, msg -> {
log.debug("Port Connected to : [{}])", msg.remoteAddress());
this.sessionHandler.tell(msg, getSelf());
sender().tell(TcpMessage.register(getSelf()), getSelf()); // Register ourselves
this.session = getSender();
this.isConnectedToClient = true;
您可以看到我的演员只是创建了其他演员,但我不想通过他们来测试他是否建立了联系。
我真的想知道我的演员何时发送Tcp.Bind或何时绑定端口以及在哪个端口上。
这是我尝试过的:
system = ActorSystem.create("sessionHandlerTest");
testProbe = new TestKit(system);
system.eventStream().subscribe(testProbe.getRef(), Tcp.Bound.class);
rmiSocket = system.actorOf(RmiSocket.props(testProbe.getRef(), settings));
Tcp.Bound bindingMessage = testProbe.expectMsgClass(Tcp.Bound.class);
我也尝试将探针注册到tcp管理器:
ActorRef tcpManager = Tcp.get(system).manager();
tcpManager.tell(TcpMessage.register(testProbe.getRef()), testProbe.getRef());
答案 0 :(得分:0)
因此,简而言之,假设您有一个需要连接到数据库的类A。您不给A实际连接,而是给A提供了A可以用来连接的接口。为了进行测试,您需要使用一些东西来实现此接口-当然不需要连接。如果类B实例化了A,则必须将“真实”数据库连接传递给A。但这意味着B将打开数据库连接。这意味着要测试B,需要将连接注入B。但是B是在类C中实例化的,依此类推。
那么我必须说“在这里我从数据库中获取数据,而我不会为这段代码编写单元测试”?
换句话说:在某些类的代码中,我必须调用sqlDB.connect()或类似的东西。我如何测试该课程?
与必须处理GUI或文件系统的代码是否相同?