首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring JUnit5中模拟JUnit5

在Spring JUnit5中模拟JUnit5
EN

Stack Overflow用户
提问于 2022-08-29 12:35:58
回答 1查看 70关注 0票数 0

我试图模拟一个套接字连接,并验证被调用的方法的顺序是否正确。

这是我的客户:

代码语言:javascript
复制
@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() {...}

}

我的单元测试:

代码语言:javascript
复制
@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)

  • startListener

  • login

  • send

  • handleMessageFromServer //接收server

  • handleLoginResult //
  1. 启动线程,将来自服务器的响应解释为Login OK
  2. startHeartBeatSender //启动另一个线程

现在它在logger.debug("Trying to connect...");上死了,我得到了一个“想要但没有被调用”的异常。

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

任何帮助或指导都会受到感谢。

EN

回答 1

Stack Overflow用户

发布于 2022-08-29 12:58:44

您的代码不是为测试而设计的(至少不是要测试的内容)。new操作符始终是不能测试此调用的标志。

尝试重新设计您的代码,以便它使用注入的Socket而不是用new创建它,这样您就可以在那里注入一个模拟,并且您的测试不依赖于.connect来正常工作。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73528899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档