SMALL
어떤 문제가 생겼나요?
STOMP 메세징 프로트콜을 이용한 프로젝트에 필요한 채팅 서비스 로직을 구성하고 Test Code 를 만들었다.
이제 TestCode 를 작성할때 웹 소켓 연결을 되었지만, 채팅을 주고 받는 Test Code 작성에 문제가 생겼다.
아래의 코드를 보면 응답 받을때 계속 null 로 체크 된다. 이해를 할수가 없다..
참고로, 웹 소켓 테스트는 통합 테스트로 진행하였다.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ChatControllerTest {
private static final String WEBSOCKET_URI = "http://localhost:{port}/chat";
private static final String WEBSOCKET_TOPIC = "/sub";
@LocalServerPort
private int port;
private BlockingQueue<ChatMessageResponse> blockingQueue;
private WebSocketStompClient stompClient;
@BeforeEach
public void setup() {
this.blockingQueue = new LinkedBlockingQueue<>();
List<Transport> transports = Collections.singletonList(new WebSocketTransport(new StandardWebSocketClient()));
this.stompClient = new WebSocketStompClient(new SockJsClient(transports));
this.stompClient.setMessageConverter(new MappingJackson2MessageConverter());
}
@DisplayName("안냥 이라는 메세지를 성공적으로 날린다.")
@Test
public void shouldSendAndReceiveMessageSuccessTest() throws Exception {
StompSession session = stompClient.connect(WEBSOCKET_URI, new StompSessionHandlerAdapter() {
}, port).get(1, TimeUnit.SECONDS);
session.subscribe(WEBSOCKET_TOPIC, new DefaultStompFrameHandler());
ChatMessageRequest testMessageRequest = new ChatMessageRequest("안냥", "테스트 이름");
session.send("/pub/sendMessage", testMessageRequest);
ChatMessageResponse receivedMessage = blockingQueue.poll(1, TimeUnit.SECONDS);
//TODO: 이게 왜 null 이지?
System.out.println(receivedMessage);
// assertEquals(testMessageRequest.name(), receivedMessage.senderName());
// assertEquals(testMessageRequest.msg(), receivedMessage.msg());
}
//TODO: 실패 케이스도 만들어야 함. 또한 token header 에 넣어서 테스트 할것.
private class DefaultStompFrameHandler implements StompFrameHandler {
@Override
public Type getPayloadType(StompHeaders headers) {
return ChatMessageResponse.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
System.out.println("reciver : " + payload);
blockingQueue.offer((ChatMessageResponse) payload);
}
}
}
@RestController
@RequiredArgsConstructor
public class ChatController {
private final SimpMessageSendingOperations template;
@MessageMapping("/sendMessage")
public void sendMessage(
@Payload ChatMessageRequest chatMessage
) {
template.convertAndSend("/sub", new ChatMessageResponse(chatMessage.name(), chatMessage.msg(), LocalDateTime.now()));
}
}
어떤 시도를 하였나요?
로그도 찍어보고 구글링을 통해 찾아보았다. 우테코에 있는 코드를 참고해서 그대로 따라 해보았지만 결국 실패 하였다.
https://tecoble.techcourse.co.kr/post/2021-11-10-web-socket-test/
어떻게 해결했나요?
아직 해결을 못하였다..
이를 통해 새롭게 알게된것들
트러블 슈팅으로 남겨놓고 나중에 고치거나 알게 될시 다시 수정하여 써보겠다..
알고 있는분들이 계신다면... 댓글로 알려주시면 감사하겠습니다 ㅠㅠ
반응형
LIST
'트러블슈팅' 카테고리의 다른 글
불필요한 연산 VS 불필요한 저장 (0) | 2023.09.02 |
---|---|
없는 페이지 요청시 Hikari 연결 누수 (0) | 2023.08.23 |
Spring 3.1.2 QueryDSL 설정 오류 (0) | 2023.08.22 |
AWS에 파일 업로드 Window 권한 오류 (0) | 2023.06.29 |
JPA 무한으로 참조가 순환 (0) | 2023.06.28 |