阅读(790) (12)

Netty单元测试总览

2017-08-07 09:50:28 更新

我们已经了解过了,为了能够构建 ChannelPipeline 的处理逻辑,可以将 ChannelHandler 实现串联在一起。之前我们也解释过了,支持有可能存在的复杂的分解处理成小的和可以重用的组件,其中的每一个定义良好的处理任务或步骤。本章将展示它简化了测试。

Netty 的促进 ChannelHandler 的测试使用的是的所谓“嵌入式”传输。这是由一个特殊 Channel 实现,EmbeddedChannel提供了一个简单的方法通过管道传递事件。

这种想法很简单:你把入站或者出站的数据写入一个EmbeddedChannel 然后检查是否能够达到 ChannelPipeline 的结束。以此来确定消息编码或解码和 ChannelHandler 是否操作被触发。

在表10.1中列出了相关方法。

名称职责
writeInbound写一个入站消息到 EmbeddedChannel。 如果数据能从 EmbeddedChannel 通过 readInbound() 读到,则返回 true
readInbound从 EmbeddedChannel 读到入站消息。任何返回遍历整个ChannelPipeline。如果读取还没有准备,则此方法返回 null
writeOutbound写一个出站消息到 EmbeddedChannel。 如果数据能从 EmbeddedChannel 通过 readOutbound() 读到,则返回 true
readOutbound从 EmbeddedChannel 读到出站消息。任何返回遍历整个ChannelPipeline。如果读取还没有准备,则此方法返回 null
Finish如果从入站或者出站中能读到数据,标记 EmbeddedChannel 完成并且返回。这同时会调用 EmbeddedChannel 的关闭方法

测试入站和出站数据

处理入站数据由 ChannelInboundHandler 处理并且表示数据从远端读取。出站数据由 ChannelOutboundHandler 处理并且表示数据写入远端。 根据 ChannelHandler 测试你会选择 writeInbound(),writeOutbound(), 或者两者都有。

图10.1显示了数据流如何通过 ChannelPipeline 使用 EmbeddedChannel 的方法。

Figure%2010

Figure 10.1 EmbeddedChannel data flow

如上图所示,使用 writeOutbound() 写消息到 Channel,消息在出站方法通过 ChannelPipeline,之后就可以使用 readOutbound() 读取消息。着同样使用与入站,使用 writeInbound() 和 readInbound()。处在

每种情况下,消息是通过 ChannelPipeline 并被有关ChannelInboundHandler 或 ChannelOutboundHandler 进行处理。如果消息是不消耗您可以使用 readInbound() 或 readOutbound() 适当的读到 Channel 处理后的消息。

让我们仔细看一下这两个场景,看看他们如何适用于测试您的应用程序逻辑。