mysterin / question_and_answer

1 stars 0 forks source link

springboot 加入 websocket 单元测试报错 #88

Closed mysterin closed 5 years ago

mysterin commented 5 years ago

配置如下:

@Configuration
public class WebsocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
@ServerEndpoint("/websocket")
@Component
public class WebSocketServer {

    private static Logger logger = LoggerFactory.getLogger(WebSocketServer.class);

    @OnOpen
    public void onOpen(Session session) {

    }

    @OnClose
    public void onClose() {

    }

    @OnMessage
    public void onMessage(String message, Session session) {
        logger.info("message: {}", message);
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnError
    public void onError(Session session, Throwable throwable) {

    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class WebSocketClientTest {

    @Test
    public void onMessage() {
        WebSocketClient client = new WebSocketClient("ws://127.0.0.1:8080/websocket");
        client.send("hello");
        client.close();
    }
}

报错如下:

Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
    at org.springframework.util.Assert.state(Assert.java:73)
    at org.springframework.web.socket.server.standard.ServerEndpointExporter.afterPropertiesSet(ServerEndpointExporter.java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1758)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1695)
    ... 39 more
mysterin commented 5 years ago

默认情况下, @SpringBootTest 是不会启动服务器的, 而 websocket 需要依赖服务器, 所以报错. 解决方法有两个:

  1. 修改 @SpringBootTest@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

或者

  1. 修改 @SpringBootTest@WebMvcTest