このための単体テストを作成しようとしています:
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() メソッドをオーバーライドしてから、代わりにサブクラスをモックする必要がありますか? それとも、もっと深刻な方法で何か間違ったことをしていますか (ヘルパー モックがモックを返します)。
よろしく、 フレドリック・イスラエルソン
リクエストに応じてテストコード:
@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 を返すため、私はそうする必要はないと信じています。