特殊的Channel实现,EmeddedChannel,专门针对ChannelHandler的单元测试提供的

并且结合JUnit4作为测试框架

EmbeddedChannel提供的功能主要是和出站和入站相关

我们可以将入站数据或者出站数据写到EmbeddedChannel中,然后检查是否有东西到达了ChannelPipeline的尾端,并且检查是否正确的执行了ChannelHandler

EmbeddedChannel相关的api如下

图片

入站数据由ChannelInboundHandler处理,代表从远程节点读取的数据,出站的有ChannelOutboundHandler处理,写到远端的数据

我们看一下如何使用EmbeddedChannel的方法,数据如何流经ChannelPipeline的

图片

那么,EmbeddedChannel来进行测试一下流程

图片

测试一个入站的消息

首先是一个简单的ByteToMessageDecoder,通过传入的数据,产生固定大小的帧,来供读取测试

这个Decoder的实现,将数据固定为3个字节大小的帧

代码如下

图片

通过集成ByteToMessageDecoder为入站的字节进行解码

然后进行相关的测试

图片

图片

这个方法验证了是否被解码为了三个字节

我们先调用writeInbound()方法的调用,填充了9个可读字节,然后调用finish(),标记为了已完成

然后查看一次读取的数据是否等于3个字节

然后测试出站的消息

仍然是一个编码器形式ChannelOutboundHandler

图片

图片

我们检测是否是4字节的负整数写入

然后读取后,调用Math.abs()方法获取绝对值

然后将绝对值写到ChannelPipeline中

测试的代码如下

图片

测试异常处理

我们尝试获取3个字节的帧,如果有超过了这个大小的帧,那么会抛出异常

图片

我们就利用位于ChannelPipeline中其他的ChannelHandler在exceptionCaught方法中处理这个异常

图片

然后利用EmbeddedChannel来测试这段代码

图片

图片

上面的异常处理,是在try/catch代码块中的

如果一个write*方法产生了一个受检查的异常,那么会被包装在一个RuntimeException中抛出

发表评论

邮箱地址不会被公开。 必填项已用*标注