Как издеваться над Нетти?

Я только что унаследовал проект, использующий netty, и он, кажется, запутался в коде, поскольку создается множество обработчиков, реализующих интерфейсы netty и т. д. Я хочу издеваться над ним таким образом, чтобы я мог добавлять тесты для тестирования из netty API вверх, запускать байты и получать байты обратно, но не подключать для этого сокет. Есть ли способ запустить сам конвейер, который бы тестировал сетевой код, а также наш код, а также получал от кода?

В частности, я хочу сделать что-то вроде этого:

SysUnderTest(channel) {
  channel.addReadListener(myListenerImpl);
}

Test {
   testStuff() {
       channelMock = new MockChannel(); 
       SysUnderTest system = new SysUnderTest(channelMock);
       //BIG NOTE: The get here is just getting what the mocked cached when the SysUnderTest
       //ended up calling the channel.addReadLsitener(listenerImpl)!!!
       ReadListener listenerImplToTest = channelMock.getAddedListenerImpl();
       listenerImplToTest.fireNewDataIncoming(byteBuffer1);
       Assert.Equals("new state", system.getState());
       listenerImplToTest.fireNewDataIncoming(byteBuffer2);
       Assert.Equals("state2", system.getState());
   }
}

Может быть, мне нужен сдвиг парадигмы, но я думаю, что любое системное тестирование с библиотекой ввода-вывода должно передавать данные слушателю, который будет реагировать. Мой тест должен запускать данные, вызывая метод события реализации слушателя (и он получает listenerImpl через фиктивный канал), но я не вижу, как это сделать в netty. В частности, какой метод запускает данные для приведенного выше примера. Похоже, он читает данные (что больше похоже на блокировку/опрос). Может быть, мне нужно изменить свою парадигму того, как я думаю об этом?


person Dean Hiller    schedule 09.12.2011    source источник


Ответы (2)


Да, взгляните на пакет встраивания в javadoc, особенно в классе DecoderEmbedder.

person forty-two    schedule 12.12.2011
comment
хммм, он говорит, что без настройки конвейера я пытаюсь смоделировать полноценный тест QA, где я передаю что-то макетное, но createpipeline выполняется кодом .... Я не могу это изменить на самом деле. Это еще как-то будет работать? - person Dean Hiller; 22.12.2011
comment
Теперь это ссылка на страницу 404. - person Pinski; 15.05.2018
comment
В Netty 4 DecoderEmbedder был заменен на EmbeddedChannel. - person Nicholas; 15.09.2019

Вы можете попробовать использовать фиктивные объекты.

См. https://github.com/netty/netty/pull/119.

 @Test
 public void testPerformOpeningHandshake() {
     Channel channelMock = EasyMock.createMock(Channel.class);

     DefaultChannelPipeline pipeline = createPipeline();

     EasyMock.expect(channelMock.getPipeline()).andReturn(pipeline);

     // capture the http response in order to verify the headers
     Capture<HttpResponse> res = new Capture<HttpResponse>();
     EasyMock.expect(channelMock.write(capture(res))).andReturn(new DefaultChannelFuture(channelMock, true));

     replay(channelMock);

     HttpRequest req = new DefaultHttpRequest(HTTP_1_1, HttpMethod.GET, "/chat");
     req.setHeader(Names.HOST, "server.example.com");
     req.setHeader(Names.UPGRADE, WEBSOCKET.toLowerCase());
     req.setHeader(Names.CONNECTION, "Upgrade");
     req.setHeader(Names.SEC_WEBSOCKET_KEY, "dGhlIHNhbXBsZSBub25jZQ==");
     req.setHeader(Names.SEC_WEBSOCKET_ORIGIN, "http://example.com");
     req.setHeader(Names.SEC_WEBSOCKET_PROTOCOL, "chat, superchat");
     req.setHeader(Names.SEC_WEBSOCKET_VERSION, "13");

     WebSocketServerHandshaker17 handsaker17 = new WebSocketServerHandshaker17("ws://example.com/chat", "chat", false);
     handsaker17.performOpeningHandshake(channelMock, req);

     Assert.assertEquals("s3pPLMBiTxaQ9kYGzzhZRbK xOo=", res.getValue().getHeader(Names.SEC_WEBSOCKET_ACCEPT));
     Assert.assertEquals("chat", res.getValue().getHeader(Names.SEC_WEBSOCKET_PROTOCOL));
 }
person Veebs    schedule 12.12.2011
comment
Какая ваша система тестируется в этом примере? WebSocketServerHandshaker17? и если это так, ПОСЛЕ того, как я дам channelMock, мне нужно отправить данные точно так же, как они выталкиваются из nio в тестируемую систему ... они не будут прочитаны, правильно, потому что в nio reads все проталкиваются по мере их поступления. Позвольте мне отредактируйте немного мой пост для примера - person Dean Hiller; 22.12.2011