Netty 系列五(单元测试).

简介: 一、概述和原理     Netty 的单元测试,主要是对业务逻辑的 ChannelHandler 做测试(毕竟对 Bootstrap、EventLoop 这些做测试着实没有多大意义),模拟一次入站数据或者出站数据,查看数据流经 ChannelHandler 变成什么样了,以此达到测试的目的。
+关注继续查看

一、概述和原理

    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

目录
相关文章
|
10天前
|
存储 Java Docker
由浅入深Netty基础知识NIO网络编程 2
由浅入深Netty基础知识NIO网络编程
20 0
|
10天前
|
监控 Java Linux
由浅入深Netty基础知识NIO网络编程1
由浅入深Netty基础知识NIO网络编程
12 0
|
10天前
|
缓存 安全 Java
由浅入深Netty基础知识NIO三大组件原理实战 2
由浅入深Netty基础知识NIO三大组件原理实战
27 0
|
10天前
|
Java
由浅入深Netty基础知识NIO三大组件原理实战 1
由浅入深Netty基础知识NIO三大组件原理实战
27 0
|
17天前
|
设计模式 JSON NoSQL
牛皮了!华为18级专家一文带你精通NIO、Netty、Redis和Zookeeper
上文给大家分享的是多线程,锁,JMM,JUC和高并发设计模式的知识点内容,想要看的小伙伴可以点击这里,文章链接:一篇神文就把java多线程,锁,JMM,JUC和高并发设计模式讲明白了。
|
29天前
|
Java Maven Spring
使用netty实现nio web服务器
使用netty实现nio web服务器
28 0
|
2月前
|
Java
以 Java NIO 的角度理解 Netty
上篇文章[《Netty 入门指南》](https://wangbinguang.blog.csdn.net/article/details/132089383)主要涵盖了 Netty 的入门知识,包括 Netty 的发展历程、核心功能与组件,并且通过实例演示了如何使用 Netty 构建一个 HTTP 服务器。由于 Netty 的抽象程度较高,因此理解起来可能会更加复杂和具有挑战性,所以本文将通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码更加清晰地理解Netty。
|
3月前
|
Java
Netty入门到超神系列-BIO、NIO、AIO的认识
I/O概述 I/O其实是Input,Output的缩写,意思是输入和输出,比如:把磁盘中的一个文件读入Java内存中,站在Java内存的角度来看就是输入即input, 可以使用Java提供的输入流如:InputStream#read 来实现。如果是把一个段文本内容从Java内存中保存到磁盘上的某个文件,站在Java内存的角度来说就是输出,可以使用Java提供的输出流:OutputStream#write() 来实现。再比如把一个数据通过网络发送给其他服务器就是输出,或者从其他服务器接收一段数据就是输入。 I/O也是有很多种的,比如Java支持三种:BIO,NIO,AIO
163 0
|
3月前
|
存储 网络协议 Java
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
56 0
相关产品
云迁移中心
推荐文章
更多