【发布时间】: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