特殊的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中抛出