【问题标题】:How to Correctly Mock a WebSocket session?如何正确模拟 WebSocket 会话?
【发布时间】:2018-09-25 13:30:06
【问题描述】:

我使用 springBoot 创建了一个简单的 websocket 应用程序。我是 Mockito 的新手,我正在尝试使用 mockito 和 junit 对跟随类的行为进行单元测试。

@Component
public class TextHandler extends TextWebSocketHandler {

WebSocketSession session;

@Override
public void handleTextMessage(WebSocketSession session, TextMessage message)
        throws InterruptedException, IOException {

        // send message
        if (session.isOpen()) {
            try {

                session.sendMessage(new TextMessage("Hello from the websocket"));
            } finally {
                session.close();
            }
        } else {
            System.out.println("no open session available");
        }
}

我为被测会话包创建了一个存根,如下所示。

@Component
public class WebSocketSessionStub implements WebSocketSession{

@Override
public String getId() {

    return "SESSION1";
}

@Override
public URI getUri() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public HttpHeaders getHandshakeHeaders() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Map<String, Object> getAttributes() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Principal getPrincipal() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public InetSocketAddress getLocalAddress() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public InetSocketAddress getRemoteAddress() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public String getAcceptedProtocol() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void setTextMessageSizeLimit(int messageSizeLimit) {
    // TODO Auto-generated method stub

}

@Override
public int getTextMessageSizeLimit() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void setBinaryMessageSizeLimit(int messageSizeLimit) {
    // TODO Auto-generated method stub

}

@Override
public int getBinaryMessageSizeLimit() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public List<WebSocketExtension> getExtensions() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void sendMessage(WebSocketMessage<?> message) throws IOException {
    // TODO Auto-generated method stub

}

@Override
public boolean isOpen() {
    System.out.println("isOpen");
    return true;
}

@Override
public void close() throws IOException {
    // TODO Auto-generated method stub

}

@Override
public void close(CloseStatus status) throws IOException {
    // TODO Auto-generated method stub

   }

 }

以下是我的单元测试类。

@RunWith(SpringRunner.class)
@SpringBootTest
public class TextHandlerTest {

@Autowired
TextHandler textHandler;

@Mock
WebSocketSessionStub ws;

@Mock
WebSocketMessage<TextMessage> webSocketMessage;

TextMessage textMsg = new TextMessage("Test Message".getBytes());

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
    textHandler.handleMessage(ws, textMsg);     
}


@Test
public void verifyCallToIsOpenConnection() throws Exception {

    verify(ws, times(1)).isOpen();
    System.out.println("isOpen " + ws.isOpen());

 }

}

以上测试通过,但isOpen 评估为假。因此我无法验证sendMessage 方法调用。我该如何纠正它?

【问题讨论】:

  • 如果您使用的是 Mockito,为什么还要使用存根?此外,您只是创建了一个模拟,并没有为它注册任何行为......boolean 的默认值是返回false。使用 Mockito 注册正确的行为(并丢弃不需要的存根)。

标签: java unit-testing spring-boot junit mockito


【解决方案1】:

您可以模拟WebSocketSession 并将其注入TextHandler#handleTextMessage

/*  
 *  You don't need spring context while mocking. 
 *  Hence No need to have spring runner. 
 */
@RunWith(MockitoJunitRunner.class)
public class TextHandlerTest {

    @Test
    public void verifyCallToIsOpenConnection() {
         WebSocketSession session = mock(WebSocketSession.class);
         TextMessage textMsg = new TextMessage("Test Message".getBytes());

         when(session.isOpen()).thenReturn(true);

         TextHandler textHandler = new TextHandler();

         // Pass the mocked session object here
         textHandler. handleTextMessage(session, textMsg);

         // Now you can verify if session.sendMessage() was called or not
         verify(session, times(1)).sendMessage(textMsg);
    }
}

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 2020-06-25
    • 2019-03-21
    • 2021-08-30
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多