EmbeddedChannel(测试Handler)
实际应用中,我们大概率需要编写各种inboundHandler
,outboundHandler
,这个时候可以使用EmbeddedChannel
来测试处理逻辑。
(测Handler
用的)
api | 作用 |
---|---|
writeInbound | 往测试channel里写数据.测试入站事件。如果这条数据能够通过所有InboundHandler ,则返回true |
writeOutbound | 往测试channel里写数据.测试出站事件。如果这条数据能够通过所有OutboundHandler ,则返回true |
readInbound | 读入站消息,无则返回null |
readOutbound | 读出站消息,无则返回null |
finish | 关闭写。还可以读。 |
示例代码:
1 |
|
可以结合JUnit
编写单元测试。
上述代码中标了几个要注意的地方:
1.duplicate和copy:
duplicate: 浅拷贝buf,生成input。数据是共享的,writerIndex和readerIndex是隔离的。
copy: 深拷贝,数据和index都是隔离的。2.retain和release:
retain: 引用计数器+1;
release: 引用计数器-1。
因为进行了浅拷贝,把引用传递给方法之前必须调一次retain
。
(如果只是和父ByteBuf同生命周期范围,不传递,可以不调。大部分时候还是调一下为好。)
最后使用结束记得要release。3.channel.finish():
channel.finish():
标记这个channel已经不能再写入数据了。(但是可以读)4.buf.readSlice(3);
返回值类似于buf.slice(3), 但是有一个read前缀,说明这个方法调用结束后会增加readerIndex。(消费行为)
作用是读出3个字节来。5.release:
使用结束记得release。
上述代码是测试入站事件,所以样例用的是inbound
和decoder
;
如果要测试出站事件,只要类似改成outbound
和encoder
即可。
异常测试
除了出站入站事件,还可以测试异常捕捉(exceptionCaught
)。
- 如果写了
exceptionCaught
,期望的结果是测试中不能捕捉到异常; - 反之如果没写,期望的结果是测试中能捕捉到异常。
前者:期望不能捕捉到(被exceptionCaught
处理了)
1 | try { |
后者:期望能捕捉到:
1 | try { |
主要还是逻辑上的控制流测试。