在 netty 中测试 channelHandlers

Testing channelHandlers in netty

我正在尝试在 Netty 中测试一些超级简单的东西,以弄清楚 EmbeddedChannel 是如何工作的。我的处理程序如下所示:

@Component
@Sharable
public class VersionServerHandler extends ChannelInboundHandlerAdapter {

    private VersionService versionService;

    @Autowired
    public VersionServerHandler(VersionService versionService) {
        this.versionService = versionService;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        boolean isSupported = versionService.isVersionSupported((VersionRequest) msg.getVersion());

        // more logic
        ctx.writeAndFlush(msg);
    }

我的测试看起来像:

 @Mock 
    private VersionService versionService;

    @Test
    public void testChannelRead() {
        EmbeddedChannel embeddedChannel = new EmbeddedChannel(new VersionServerHandler(versionService); 
        ByteBuf buf = Unpooled.buffer();
        for (int i = 0; i < 9; i++) {
            buf.writeByte(i);
        }
        ByteBuf dup = buf.duplicate();

        boolean test = embeddedChannel.writeInbound(dup.retain());
        // test is false

我只是想用 VersionServerHandler 向 EmbeddedChannel 写入字节,就像在 netty 示例中一样,但是 test 是假的而不是真。有什么我想念的吗?

这是因为 writeInbound(...) 只有在消息到达管道末端时才会 return true。要检查您想要检查的内容,您可以调用 writeInbound(...) 然后使用 readOutbound() 并检查它不是 return null。另外 channel.finish() 应该 return true.