Page History
...
유닛테스트 코드 분석
✅ 1. 테스트 대상 기능
테스트하려는 핵심 기능은 다음과 같습니다:
WebSocket 세션을 액터에 등록 (
AddSession)등록된 세션에 메시지를 보냄 (
SendMessageToSession)Ping메시지를 보내 상태 확인 (응답으로Pong을 기대)메시지가 WebSocket 세션을 통해 정확하게 전송되었는지 검증
...
🧩 코드 구성 요소 분석
🎯 val probe = testKit.createTestProbe<UserSessionResponse>()
액터에서 보낸 응답 메시지를 기다리기 위한 테스트 프로브입니다.
실제 메시지를 기다릴 수 있어서 비동기 액터 테스트에 적합합니다.
🧪 session, textMessage Mocking
| Code Block | ||
|---|---|---|
| ||
val session = Mockito.mock(WebSocketSession::class.java)
val textMessage = Mockito.mock(WebSocketMessage::class.java) |
실제 네트워크/WebSocket 동작 없이 가짜 세션을 만들어 테스트합니다.
Mockito.when(...).thenReturn(...)으로 동작 정의.
🧠 actor.tell(...) 시나리오 실행
| Code Block | ||
|---|---|---|
| ||
actor.tell(AddSession(session))
actor.tell(SendMessageToSession("session1", "Hello")) |
WebSocket 세션을 액터에 등록하고,
메시지를 특정 세션 ID로 전송하도록 명령.
⏱️ Ping - 상태 확인용 메시지
| Code Block | ||
|---|---|---|
| ||
actor.tell(Ping(probe.ref()))
probe.expectMessageClass(Pong::class.java) |
액터가 내부적으로 메시지 처리를 마쳤는지 확인하는 수단.
비동기 코드에서 완료 시점 확인을 위한 좋은 패턴.
✅ 메시지 직렬화와 검증
| Code Block | ||
|---|---|---|
| ||
val expectedJson = objectMapper.writeValueAsString(expectedMessage)
Mockito.verify(session).textMessage(Mockito.eq(expectedJson)) |
EventTextMessage가 올바르게 JSON으로 변환되어 WebSocket으로 전송되었는지 검증.실질적인 출력값을 비교함으로써 테스트의 신뢰도 향상.
🌟 장점 요약
| 항목 | 장점 |
| Mock 기반 테스트 | 실제 네트워크 없이 WebSocket 동작을 검증할 수 있어 빠르고 안정적 |
| 비동기 메시지 처리 검증 | testProbe + Ping/Pong 패턴으로 액터의 처리 완료 타이밍을 명확하게 파악 |
| 직렬화 검증 포함 | 객체가 예상한 JSON 형식으로 변환되어 메시지 전송되는지까지 검증 |
| 액터 기반 테스트 구조 | 메시지 기반 설계가 잘 반영되어 있고, 액터의 상태 관리가 유연하게 테스트 가능 |
| 단일 책임 테스트 | 세션 등록 → 메시지 전송 → 검증까지 각 흐름이 분리되어 명확 |
💡 개선 포인트 (보너스)
verify(session).send(...)도 함께 확인하면 실제 메시지 전송까지 테스트 가능예외 상황 (예: 존재하지 않는 세션에 메시지 보낼 때)도 추가하면 완전한 커버리지 확보
| Code Block | ||
|---|---|---|
| ||