我实现了一个扩展了SimpleChannelHandler的处理程序,并覆盖了一些方法,例如channelConnected、messageReceived等。然而,我想知道如何对其进行单元测试?
我搜索了有关“netty单元测试”的内容,并发现了一篇文章,其中提到了考虑CodecEmbedder,但我仍然不确定如何开始。您有任何示例或建议可以用来对Netty代码进行单元测试吗?
非常感谢。
我实现了一个扩展了SimpleChannelHandler的处理程序,并覆盖了一些方法,例如channelConnected、messageReceived等。然而,我想知道如何对其进行单元测试?
我搜索了有关“netty单元测试”的内容,并发现了一篇文章,其中提到了考虑CodecEmbedder,但我仍然不确定如何开始。您有任何示例或建议可以用来对Netty代码进行单元测试吗?
非常感谢。
在Netty中,有不同的方法来测试您的网络堆栈。
您可以使用Netty的EmbeddedChannel
来模拟用于测试的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的能力是否正确(由我发布的此错误的示例)。
您还可以使用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
,您可以设置一个JVM参数来检查泄漏的ByteBuf
。为此,您应该将-Dio.netty.leakDetectionLevel=PARANOID
添加到启动参数中,或调用方法ResourceLeakDetector.setLevel(PARANOID)
。
ResourceLeakDetector.setLevel(PARANOID)
时,您建议我们如何通过或失败测试? - Dave Moten