[英]Junit5 Spring Boot Autowire ComponentScan Not Working
[英]Mock ServerSocket in Spring Boot JUnit5
我正在尝试模拟套接字连接并验证调用方法的顺序是否正确。
这是我的客户:
@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();
所以基本上我想要这个订单:
目前它在logger.debug("Trying to connect...");
我收到“通缉但未调用”异常。
通常的用法是让第三方服务器运行,然后启动我自己的 spring 引导服务,该服务连接到上述服务器。
任何帮助或方向表示赞赏。
您的代码不是为测试而设计的(至少不是您想要测试的东西)。 new
运算符始终表明您无法测试此调用。
尝试重新设计您的代码,使其使用注入的Socket
而不是使用new
创建它,因此您可以在那里注入一个模拟,并且您的测试不依赖.connect
来实际工作。
如果直接注入不起作用,您也可以尝试为Socket
注入工厂,因为每个 class 实例都需要不止一次的套接字。 对于测试,您可以注入一个返回模拟Socket
的模拟工厂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.