我正在尝试为此编写一个单元测试:
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 为空。
我应该继承 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() 返回无效。