Page History
| Info |
|---|
Reactive 모드의 웹소켓을 활용해 PubSub의 기능을 액터모델을 통해 구현하는것을 간략하게 알아보고 웹소켓과 실시간성 처리 대응이 가능한 액터모델을 함께 블락킹 없이 유닛테스트 하는 방법을 알아보겠습니다. |
웹소켓은 브라우저와 양방향 통신이 가능한 특징이 있으며 , 웹소켓 핸들러를 이용해
액터모델에 연결할수 있으며, 액터모델이 가진 특징을 이용해 분산처리로 확장을 할수 있습니다.
Reactive Websocket with Actor 이벤트 흐름표
- WebClient : 브라우저에서 웹소켓 이벤트를 발생시킵니다.
- SocketHandler : 서버에서 웹소켓 이벤트를 수신받을수 있습니다. 수신받은 이벤트를 액터모델에 전달합니다.
- UserSessionActor : 웹소켓 세션을 액터모델을 통해 관리합니다.
UserSessionManager Actor
SocketHandler
유닛테스트 코드
| Code Block | ||
|---|---|---|
| ||
@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))
} |



