我試圖寫一個單元測試此:如何正確模擬自動關閉的資源?
try (final DatagramChannel channel = helper.createChannel()) {
...
}
在我的測試,我嘲笑助手(使用的Mockito),並告訴helper.createChannel()返回一個嘲笑道。
此測試失敗,
java.lang.NullPointerException
at java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:111)
據我所知,試與 - 資源工廠在Java中在退出try塊調用了DatagramChannel的close()方法,但應該不是關閉()方法在模擬的DatagramChannel被調用?
調試器告訴我AbstractInterruptibleChannel中的closeLock爲null。
我應該繼承DatagramChannel嗎?重寫close()方法,然後模擬我的子類嗎? 或者,我是否以更深刻的方式做了錯誤的事情(幫手模擬模擬)?
問候, 弗雷德裏克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。
你能展示你的代碼在哪裏嘲笑這些嗎?也有你通過調試,並確認a)輔助實際上是一個模擬,b)helper.createChannel()也返回一個模擬對象? – cowls 2013-02-28 08:50:44
添加了測試代碼,並且在調試器中,助手和通道的類型都是BlaBlaBla $$ EnhancerByMockitoWithCGLIB。 – 2013-02-28 09:06:55
本頁面:http://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#doNothing%28%29明確指出「虛擬模擬方法默認不做任何事情!」。所以我們只能假設finally塊不是在模擬上執行的。你的代碼對我來說看起來很好,儘管如此我不知道爲什麼這是..你當然不應該需要自己的子類。 – cowls 2013-02-28 09:34:35