Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

전체 코드 :https://github.com/psmon/kopring-reactive-labs/blob/main/KotlinBootReactiveLabs/src/test/kotlin/org/example/kotlinbootreactivelabs/ws/actor/chat/UserSessionManagerActorTest.kt


유닛테스트 코드 분석

1. 테스트 대상 기능

테스트하려는 핵심 기능은 다음과 같습니다:

  1. WebSocket 세션을 액터에 등록 (AddSession)

  2. 등록된 세션에 메시지를 보냄 (SendMessageToSession)

  3. Ping 메시지를 보내 상태 확인 (응답으로 Pong을 기대)

  4. 메시지가 WebSocket 세션을 통해 정확하게 전송되었는지 검증

...

🧩 코드 구성 요소 분석

🎯 val probe = testKit.createTestProbe<UserSessionResponse>()

  • 액터에서 보낸 응답 메시지를 기다리기 위한 테스트 프로브입니다.

  • 실제 메시지를 기다릴 수 있어서 비동기 액터 테스트에 적합합니다.

🧪 session, textMessage Mocking

Code Block
themeEmacs
val session = Mockito.mock(WebSocketSession::class.java)
val textMessage = Mockito.mock(WebSocketMessage::class.java)
  • 실제 네트워크/WebSocket 동작 없이 가짜 세션을 만들어 테스트합니다.

  • Mockito.when(...).thenReturn(...)으로 동작 정의.


🧠 actor.tell(...) 시나리오 실행

Code Block
themeEmacs
actor.tell(AddSession(session))
actor.tell(SendMessageToSession("session1", "Hello"))
  • WebSocket 세션을 액터에 등록하고,

  • 메시지를 특정 세션 ID로 전송하도록 명령.


⏱️ Ping - 상태 확인용 메시지

Code Block
themeEmacs
actor.tell(Ping(probe.ref()))
probe.expectMessageClass(Pong::class.java)
  • 액터가 내부적으로 메시지 처리를 마쳤는지 확인하는 수단.

  • 비동기 코드에서 완료 시점 확인을 위한 좋은 패턴.

✅ 메시지 직렬화와 검증

Code Block
themeEmacs
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
themeEmacs