繁体   English   中英

Spring Boot JUnit5 中的 Mock ServerSocket

[英]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();

所以基本上我想要这个订单:

  1. 启动线程(startTCPConnection)
  2. 启动监听器
  3. 登录
  4. 发送
  5. handleMessageFromServer // 从服务器接收 OK
  6. handleLoginResult // 将来自服务器的响应解释为 Login OK
  7. startHeartBeatSender // 启动另一个线程

目前它在logger.debug("Trying to connect..."); 我收到“通缉但未调用”异常。

通常的用法是让第三方服务器运行,然后启动我自己的 spring 引导服务,该服务连接到上述服务器。

任何帮助或方向表示赞赏。

您的代码不是为测试而设计的(至少不是您想要测试的东西)。 new运算符始终表明您无法测试此调用。

尝试重新设计您的代码,使其使用注入的Socket而不是使用new创建它,因此您可以在那里注入一个模拟,并且您的测试不依赖.connect来实际工作。

如果直接注入不起作用,您也可以尝试为Socket注入工厂,因为每个 class 实例都需要不止一次的套接字。 对于测试,您可以注入一个返回模拟Socket的模拟工厂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM