Netty 系列五(单元测试).
2018-07-16 02:39:23来源:博客园 阅读 ()
一、概述和原理
Netty 的单元测试,主要是对业务逻辑的 ChannelHandler 做测试(毕竟对 Bootstrap、EventLoop 这些做测试着实没有多大意义),模拟一次入站数据或者出站数据,查看数据流经 ChannelHandler 变成什么样了,以此达到测试的目的。
Netty 的单元测试将Junit4作为测试框架,将 EmbeddedChannel 作为测试通道。基本原理就是:将入站数据或者出站数据写入 EmbeddedChannel 中,然后检查是否有任何东西到达了 ChannelPipeline 的尾端。以这种方式,你便可以知道消息是否流经了 ChannelHandler 以及是否触发了任何 ChannelHandler 的动作,如下图:
EmbeddedChannel 提供了如下方法进行单元测试:
writeInbound(Object... msgs): 将入站消息写到 EmbeddedChannel 中。如果可以通过 readInbound()方法从 EmbeddedChannel 中读取数据,则返回 true。
readInbound() :从 EmbeddedChannel 中读取一个入站消息。任何返回的东西都穿越了整个 ChannelPipeline。如果没有任何可供读取的, 则返回 null。
writeOutbound(Object... msgs): 将出站消息写到EmbeddedChannel中。如果现在可以通过readOutbound()方法从 EmbeddedChannel 中读取到什么东西,则返回 true。
readOutbound(): 从 EmbeddedChannel 中读取一个出站消息。任何返回的东西都穿越了整个 ChannelPipeline。如果没有任何可供读取的,则返回 null。
finish() :将 EmbeddedChannel 标记为完成,并且如果有可被读取的入站数据或者出站数据,则返回 true。这个方法还将会调用 EmbeddedChannel 上的close()方法。
二、测试入站数据
1、将我们要测试的 ChannelHandler 写入 EmbeddedChannel 进行测试。
2、writeInbound(Object... msgs) 将数据写入EmbeddedChannel(模拟接收数据)。
3、ChannelHandler 处理后如果有返回数据,可以通过readInbound() 验证数据结果。如果没有返回数据,可以在 ChannelHandler 业务逻辑中,打印日志,以达到测试目的。
public class DecoderTest { //1、利用Junit执行单元测试 @Test public void decoderTest() throws IllegalAccessException { ByteBuf buf = Unpooled.buffer(); for (int i = 0; i < 9; i++) { buf.writeByte(i); } ByteBuf buf1 = buf.duplicate(); //2、创建EmbeddedChannel,并添加一个Decoder(我们的要测试 ChannelHandler) 其将以3字节帧长度被测试 EmbeddedChannel embeddedChannel = new EmbeddedChannel(new Decoder(3)); //3、将数据写入 EmbeddedChannel boolean writeInbound = embeddedChannel.writeInbound(buf1.retain()); assertTrue(writeInbound); //4、标记 Channel 为已完成状态 boolean finish = embeddedChannel.finish(); assertTrue(finish); //5、读取数据 ByteBuf readInbound = embeddedChannel.readInbound(); ByteBuf readSlice = buf.readSlice(3); assertEquals(readInbound, readSlice); readInbound.release(); readInbound = embeddedChannel.readInbound(); readSlice = buf.readSlice(3); assertEquals(readInbound, readSlice); readInbound.release(); readInbound = embeddedChannel.readInbound(); readSlice = buf.readSlice(3); assertEquals(readInbound, readSlice); readInbound.release(); //是否读取完数据了 assertNull(embeddedChannel.readInbound()); //释放资源 buf.release(); } }
三、测试出站数据
1、将我们要测试的 ChannelHandler 写入 EmbeddedChannel 进行测试。
2、writeOutbound(Object... msgs) 将数据写入EmbeddedChannel(模拟发送数据)。
3、ChannelHandler 处理后如果有返回数据,可以通过readOutbound() 验证数据结果。如果没有返回数据,可以在 ChannelHandler 业务逻辑中,打印日志,以达到测试目的。
public class EncoderTest { @Test public void encoderTest(){ ByteBuf buf = Unpooled.buffer(); for (int i =1; i < 10; i++){ buf.writeInt(i * -1); } //1、创建一个EmbeddedChannel 并安装要测试的Encoder EmbeddedChannel embeddedChannel = new EmbeddedChannel(new Encoder()); //2、写入数据 assertTrue(embeddedChannel.writeOutbound(buf)); assertTrue(embeddedChannel.finish()); //3、读取数据 for (int i = 1; i < 10; i++){ Object o = embeddedChannel.readOutbound(); System.out.println(o); } assertNull(embeddedChannel.readOutbound()); } }
四、结语
截止到这篇文章,Netty 的基础部分差不多就结束了。不幸的是,公司安排我去研究下 Docker 技术,想在我们项目中使用起来。所以 Netty 的学习就不得不告一段落了~~才翻完《Netty 实战》一半的内容,后面还有编解码器、网络协议、案例研究三个部分,只能先欠下了~
参考资料:《Netty IN ACTION》
演示源代码:https://github.com/JMCuixy/NettyDemo/tree/master/src/main/java/org/netty/demo/unit
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java迭代器升级版探究
- Spring系列.ApplicationContext接口 2020-06-11
- logstash系列-入门整理 2020-06-10
- Spire.Cloud.SDK for Java 合并、拆分Excel单元格 2020-06-09
- 秒懂系列,超详细Java枚举教程!!! 2020-06-08
- 这可能是目前最透彻的Netty讲解了... 2020-06-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash