我实现了一个扩展 SimpleChannelHandler 的处理程序,并覆盖了一些方法,例如 channelConnected、messageReceived。但是,我想知道如何对其进行单元测试?</p>
我搜索了“netty unit test”,发现一篇文章说考虑CodecEmbedder,但我仍然不知道如何开始。您对如何对 Netty 代码进行单元测试有任何示例或建议吗?
非常感谢。
我实现了一个扩展 SimpleChannelHandler 的处理程序,并覆盖了一些方法,例如 channelConnected、messageReceived。但是,我想知道如何对其进行单元测试?</p>
我搜索了“netty unit test”,发现一篇文章说考虑CodecEmbedder,但我仍然不知道如何开始。您对如何对 Netty 代码进行单元测试有任何示例或建议吗?
非常感谢。
在 Netty 中,有不同的方法来测试你的网络堆栈。
您可以使用 NettyEmbeddedChannel
模拟 netty 连接进行测试,例如:
@Test
public void nettyTest() {
EmbeddedChannel channel = new EmbeddedChannel(new StringDecoder(StandardCharsets.UTF_8));
channel.writeInbound(Unpooled.wrappedBuffer(new byte[]{(byte)0xE2,(byte)0x98,(byte)0xA2}));
String myObject = channel.readInbound();
// Perform checks on your object
assertEquals("☢", myObject);
}
上面的这个测试测试了 StringDecoder 正确解码 unicode 的能力(来自我发布的这个 bug 的示例)
您还可以使用 测试编码器方向EmbeddedChannel
,为此您应该使用writeOutBound
和readInbound
。
更多示例:
DelimiterBasedFrameDecoderTest.java:
@Test
public void testIncompleteLinesStrippedDelimiters() {
EmbeddedChannel ch = new EmbeddedChannel(new DelimiterBasedFrameDecoder(8192, true,
Delimiters.lineDelimiter()));
ch.writeInbound(Unpooled.copiedBuffer("Test", Charset.defaultCharset()));
assertNull(ch.readInbound());
ch.writeInbound(Unpooled.copiedBuffer("Line\r\ng\r\n", Charset.defaultCharset()));
assertEquals("TestLine", releaseLater((ByteBuf) ch.readInbound()).toString(Charset.defaultCharset()));
assertEquals("g", releaseLater((ByteBuf) ch.readInbound()).toString(Charset.defaultCharset()));
assertNull(ch.readInbound());
ch.finish();
}
要测试你是否使用你bytebuf
的 s,你可以设置一个 JVM 参数来检查泄漏的 ByteBuf,为此,你应该添加-Dio.netty.leakDetectionLevel=PARANOID
到启动参数中,或者调用方法ResourceLeakDetector.setLevel(PARANOID)
。