我正在尝试为此编写单元测试:
try (final DatagramChannel channel = helper.createChannel()) {
...
}
在我的测试中,我模拟了帮助器(使用Mockito),并告诉helper.createChannel()返回一个模拟通道.
此测试失败了
java.lang.NullPointerException
at java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:111)
我知道Java中的try-with-resources工具在退出try块时调用DatagramChannel中的close()方法,但是不应该调用模拟的DatagramChannel中的close()方法吗?
调试器告诉我AbstractInterruptibleChannel中的closeLock为null.
我应该继承DatagramChannel,重写其中的close()方法,然后模拟我的子类吗?
或者,我是否以更深刻的方式做错了(帮助器模拟返回模拟)?
问候,
Fredrik Israelsson
测试代码,根据要求:
@Mock
private InetAddress peerAddress;
@Mock
private UDPChannelHelper helper;
@Mock
private DatagramChannel channel;
private UDPTransportImpl transport;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(helper.createChannel()).thenReturn(channel);
transport = new UDPTransportImpl(peerAddress, 0, helper);
}
@Test
public void testNormalSubmit() throws Exception {
transport.submit("Hello");
}
如您所见,我没有为channel.close()指定任何行为.我相信我不应该,因为close()返回void.