У меня проблемы с интеграционными тестами с WebSockets и SpringBoot. Если я попытаюсь подключиться к StomJS с веб-страницы, клиент получит уведомление. Но в тесте интеграции с клиентом Java я получаю исключение. Как правильно писать эти тесты? Мой класс конфигурации выглядит так:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends
AbstractWebSocketMessageBrokerConfigurer {
@Autowired
private ConnectionInterceptor connectionInterceptor;
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(connectionInterceptor);
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry
.addEndpoint(ApiConstants.SOCKET_BASE_URL)
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker( "/topic", "/queue" );
registry.setApplicationDestinationPrefixes("/app");
registry.setUserDestinationPrefix("/user");
}
}
Мой тест:
@Test
@WithMockUser(authorities = "ADMIN")
public void ShouldLogoutGroupOfUsers() throws Exception {
String url = "ws://127.0.0.1:" + port+ "/socket";
StompSessionHandler sessionHandler = new MyStompSessionHandler();
CompletableFuture<SocketMessage> completable = new
CompletableFuture<>();
val stompHeaders = new StompHeaders();
//add authorization headers
stompHeaders.add(
tokenHeaderKey,
getUserHeaders().getValuesAsList(tokenHeaderKey).get(0)
);
val session = getStompClient().connect(
url,
new WebSocketHttpHeaders(),
stompHeaders,
new StompSessionHandlerAdapter() {
}
).get(1, SECONDS);
assertTrue(session.isConnected());
stompHeaders.setDestination("/user/queue/action/logout");
val subscription = session.subscribe(
stompHeaders,
new StompMessageHandler<>(completable,
SocketMessage.class)
);
Теперь я вызываю метод контроллера, который вызовет:
sender.convertAndSendToUser(registeredUser, DEVICE_LOGOUT_PATH,new
SocketMessage("hello socket"));
И тест не проходит в этой строке:
SocketMessage message = completable.get(30, SECONDS);
Я решил проблему сам, проблема заключалась в неправильном пути к конечной точке, Я буду обновлять https://github.com/MajidHajric/stomp-test позже.
Я попытался исправить то же самое, но это все еще не работает. Смотрите на GitHub: github.com/MajidHajric/stomp-test. JS-клиент может нормально подключаться, когда вы смотрите в журнал консоли.
Я создал стартовый проект весенней загрузки для Stomp с неудачными тестами: github.com/MajidHajric/stomp-test.