Как да се подигравам на Нети?

Току-що наследих проект, използващ netty и изглежда, че се заплита в кода, тъй като много манипулатори са създадени, внедряващи netty интерфейси и т.н. Искам да го подиграя по такъв начин, че да мога да добавя тестове за тестване от netty api нагоре, изстрелване на байтове и получаване на байтове обратно, но без свързване на сокет за това. Има ли някакъв начин сам да се задействам в тръбопровода, който да тества netty кода, както и нашия код и също да получава от кода?

По-конкретно, търся да направя нещо подобно:

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());
   }
}

Може би имам нужда от промяна на парадигмата, но мисля, че всяко системно тестване с IO библиотека трябва да изстрелва данни към слушател, който ще реагира. Моят тест трябва да задейства данни чрез извикване на метода на събитието на слушателя (и той получава 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 четенията всички се изтласкват, когато влязат. Нека редактирайте моя пост малко като пример - person Dean Hiller; 22.12.2011