
Reactive 모드의 웹소켓을 활용해 PubSub의 기능을 액터모델을 통해 구현하는것을 간략하게 알아보고 웹소켓은 브라우저와 양방향 통신이 가능한 특징이 있으며 , 웹소켓 핸들러를 이용해 액터모델에 연결할수 있으며, 액터모델이 가진 특징을 이용해 분산처리로 확장을 할수 있습니다. CRUD 테스트인경우 블락킹 기법의 일반적 유닛테스트를 이용하면 되지만, 실시간 이벤트가 작동하는 모듈을 중단시키지 않고 블락없이 최종 수신 검증을 하는 방법을 알아보겠습니다. |


리액티브 웹소켓+액터모델을 통해 PUBSUB 구현된 코드를 간략하게 살펴보고 유닛테스트를 수행해보겠습니다.


@Test
fun testSendMessageToSession() {
val probe = testKit.createTestProbe<UserSessionResponse>()
val session = Mockito.mock(WebSocketSession::class.java)
val textMessage = Mockito.mock(WebSocketMessage::class.java)
Mockito.`when`(session.id).thenReturn("session1")
Mockito.`when`(session.textMessage(Mockito.anyString())).thenReturn(textMessage)
Mockito.`when`(session.send(Mockito.any())).thenReturn(Mono.empty())
val actor = testKit.spawn(UserSessionManagerActor.create())
actor.tell(AddSession(session))
actor.tell(SendMessageToSession("session1", "Hello"))
// Test for DelayedMessage
actor.tell(Ping(probe.ref()))
probe.expectMessageClass(Pong::class.java)
// Create an actual instance of EventTextMessage
val expectedMessage = EventTextMessage(
type = MessageType.SESSIONID,
message = "Connected",
from = MessageFrom.SYSTEM,
id = "session1",
jsondata = null
)
// Verify that textMessage was called with the correct JSON value
val objectMapper = jacksonObjectMapper()
val expectedJson = objectMapper.writeValueAsString(expectedMessage)
Mockito.verify(session).textMessage(Mockito.eq(expectedJson))
} |