Две вещи, которые могут помочь:
Не добавляйте аннотацию с помощью @ChannelHandler.Sharable
, если ваш обработчик НЕ является общедоступным. Это может ввести в заблуждение. Удалите ненужное состояние из обработчиков. В вашем случае вы должны удалить переменную-член remoteAddress
и убедиться, что Gson
и CarParkPermissionService
могут быть повторно использованы и являются поточно-ориентированными.
"Your remote address is embedded"
НЕ является ошибкой . На самом деле это сообщение, написанное вашим обработчиком на исходящий канал (см. Ваш channelActive()
метод)
Так что похоже, что это может сработать.
EDIT
После ваших комментариев, вот некоторые пояснения по второму пункту. Я имею в виду, что:
- ваш код, использующий
EmbeddedChannel
, почти правильный. Есть просто недопонимание ожидаемых результатов (assert).
Чтобы сделать модульный тест успешным, вам нужно либо:
- , чтобы прокомментировать эту строку в
channelActive()
: ctx.writeAndFlush("Your remote ...")
- или для опроса второго сообщения от
Queue<Object> outboundMessages
в testHeartbeatMessage()
Действительно, когда вы это сделаете:
// when
embeddedChannel.writeInbound(request);
(1) Фактически вы открываете канал один раз, что вызывает событие channelActive()
. У вас нет журнала, но мы видим, что переменная remoteAddress
впоследствии не имеет значения null, что означает, что она была назначена в методе channelActive()
.
(2) В конце метода channelActive()
вы в конечном итоге уже отправляете сообщение, записывая в конвейере канала, как показано в этой строке:
ctx.writeAndFlush("Your remote address is " + remoteAddress + ".\r\n");
// In fact, this is the message you see in your failed assertion.
(3) Затем сообщение, написанное embeddedChannel.writeInbound(request)
, получено и может быть прочитано, что вызывает событие channelRead()
. На этот раз мы видим это в вашем журнале:
22:21:29.062 [main] INFO handler.ProcessingHandler - CLIENT_IP: embedded
22:21:29.062 [main] INFO handler.ProcessingHandler - CLIENT_REQUEST: {"messageID":"heartbeat"}
22:21:29.067 [main] DEBUG handler.ProcessingHandler - heartbeat request: HeartbeatRequest(messageID=heartbeat)
(4) В конце channelRead(ChannelHandlerContext ctx, Object msg)
вы отправите сообщение секунда (ожидаемый):
HeartbeatResponse response = HeartbeatResponse.builder()
.responseCode("ok")
.build();
ctx.writeAndFlush(response + "\n\r");
Следовательно, с помощью следующего кода вашего модульного теста ...
Queue<Object> outboundMessages = embeddedChannel.outboundMessages();
assertEquals(expected, outboundMessages.poll());
... вы сможете poll()
два сообщения :
"Your remote address is embedded"
"{ResponseCode":"ok"}
Имеет ли смысл для вас?