我试图模拟一个套接字连接,并验证被调用的方法的顺序是否正确。
这是我的客户:
@Component
public class Communicator extends Thread {
public void startTCPConnection() {
logger.debug("Trying to connect...");
try {
client = new Socket();
client.connect(new InetSocketAddress(ip, port), reconnectTimeout);
clientConnected = true;
startListener(); // FIRST METHOD TO VERIFY
out = new PrintWriter(client.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
login(); // SECOND METHOD TO VERIFY
} catch (Exception e) {
clientConnected = false;
isLoggedIn = false;
utility.sleep(reconnectTimeout);
startTCPConnection();
}
}
public void startListener() {
listener.start();
}
public void login() {
String loginSequence = "asdf";
send(loginSequence); // THIRD METHOD TO VERIFY
}
public void send(String message) {...}
// FOURTH METHOD TO VERIFY
public void handleMessageFromServer(String message) {
if (!isLoggedIn) {
handleLoginResult(message);
} else {
handleMessageAfterLogin(message);
}
}
// FIFTH METHOD TO VERIFY
public void handleLoginResult(String message) {
if (isLoginSuccessful(message)) {
isLoggedIn = true;
startHeartBeatSender();
}
}
public void startHeartBeatSender() {...}
}我的单元测试:
@Spy
private Communicator communicator;
@Test
public void testStartTCPConnection() throws IOException {
setupProperties();
communicator.start();
verify(communicator).startListener();
verify(communicator).login();
verify(communicator).send(correctLoginString);
verify(communicator).handleMessageFromServer(correctLoginResultString);
verify(communicator).handleLoginResult(correctLoginResultString);
verify(communicator).startHeartBeatSender();所以基本上我想要这个命令:
从(startTCPConnection)
现在它在logger.debug("Trying to connect...");上死了,我得到了一个“想要但没有被调用”的异常。
通常的用法是让第三方服务器运行,然后启动我自己的spring引导服务,该服务连接到上述服务器。
任何帮助或指导都会受到感谢。
发布于 2022-08-29 12:58:44
您的代码不是为测试而设计的(至少不是要测试的内容)。new操作符始终是不能测试此调用的标志。
尝试重新设计您的代码,以便它使用注入的Socket而不是用new创建它,这样您就可以在那里注入一个模拟,并且您的测试不依赖于.connect来正常工作。
如果直接注入不起作用,您也可以尝试为Socket注入一个工厂,因为您需要类的每个实例不止一次使用套接字。对于测试,您可以注入一个模拟工厂,该工厂返回一个模拟Socket。
https://stackoverflow.com/questions/73528899
复制相似问题