Модульное тестирование Netty: Как проверить вызовы объекта Channel, который является частью переданного ChannelHandlerContext? - PullRequest
0 голосов
/ 17 февраля 2020

Часть поведения реализации ChannelHandler заключается в том, что она должна отправлять ответ после получения сообщения. Однако переданный ChannelHandlerContext, похоже, создает внутренний экземпляр Channel, который не равен экземпляру EmbeddedChannel, используемому в модульном тесте. Таким образом, невозможно проверить извне, что ответ фактически был записан в канал.

Вот код, проясняющий проблему:

public class EchoHandler extends SimpleChannelInboundHandler<Object>
{
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception
    {
        ctx.channel().writeAndFlush(msg);
    }
}

@Test
public void aTest() throws Exception
{
    EchoHandler handler = new EchoHandler();
    EmbeddedChannel channel = spy(new EmbeddedChannel(handler));
    Object anObject = new Object();
    channel.writeInbound(anObject);
    verify(channel, times(1)).writeAndFlush(eq(anObject)); // will fail
}

1 Ответ

1 голос
/ 17 февраля 2020

Так просто, как получается:

public class EchoHandlerTest {

    static class EchoHandler extends ChannelInboundHandlerAdapter {

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            ctx.channel().writeAndFlush(msg);
        }
    }

    @Test
    public void aTest() throws Exception {
        EmbeddedChannel channel = new EmbeddedChannel(new EchoHandler());
        Object anObject = new Object();
        channel.writeInbound(anObject);
        assertThat(channel.readOutbound(), is(anObject));
    }
}
...