Netty 使用 EmbeddedChannel 进行单元测试
对于 Netty 的 ChannelHandler 进行单元测试,Netty 提供了 EmbeddedChannel 嵌入式通道来完成这一过程,主要使用该通道来测试数据的入站出站过程是否合法;
该通道提供以下常用的 API:
writeInbound | 写一个入站消息到 EmbeddedChannel。 如果数据能从 EmbeddedChannel 通过 readInbound() 读到,则返回 true; |
readInbound | 从 EmbeddedChannel 读到入站消息。任何返回遍历整个ChannelPipeline。如果读取还没有准备,则此方法返回 null; |
writeOutbound | 写一个出站消息到 EmbeddedChannel。 如果数据能从 EmbeddedChannel 通过 readOutbound() 读到,则返回 true; |
readOutbound | 从 EmbeddedChannel 读到出站消息。任何返回遍历整个ChannelPipeline。如果读取还没有准备,则此方法返回 null; |
Finish | 如果从入站或者出站中能读到数据,标记 EmbeddedChannel 完成并且返回。这同时会调用 EmbeddedChannel 的关闭方法; |
以下图示了 ChannelPipeline 使用 EmbeddedChannel 的方法:
以下实例完整代码地址:
https://gitee.com/assad/netty-test-sample/tree/master/netty-test-sample/src/main/java/junitSample
入站处理器测试
以下测试一个入站解码器 FixedLengthFrameDecoder;
FixedLengthFrameDecoder
//用于进行测试的 Decoder,将读取的帧分隔为固定长度
public class FixedLengthFrameDecoder extends ByteToMessageDecoder {
private final int frameLength; //帧长度
public FixedLengthFrameDecoder(int frameLength) {
this.frameLength = frameLength;
}
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
//帧分割
while(in.readableBytes() >= frameLength)
out.add(in.readBytes(