我正在使用Netty 4.0爲我的主人論文創建分佈式隱私保護算法。我做了TDD,並且大部分時間這個工作很好,因爲Netty的模塊化API。上週我遇到的一個問題是我不知道如何測試取決於ChannelFutureListener
的代碼。因此,可以說我在我的應用程序中有以下代碼:Netty,如何模擬ChannelFuture/ChannelPromise?
public ChannelFuture close() {
if(channel == null)
throw new IllegalStateException("Channel is null.");
ChannelFuture f = channel.close();
f.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture chf) throws Exception {
channel = null;
}
});
return f;
}
現在我試圖用單元測試來測試這個特定的方法。爲了達到這個目的,我需要一種方法來模擬ChannelFuture
(ChannelPromise)來控制監聽器的方法operationComplete
的調用。我嘗試了不同的方法。這裏是一個例子測試用例:
@Test
public void testConnectAfterClose() {
Channel chMock = mock(Channel.class);
ChannelPromise promise = new DefaultChannelPromise(chMock);
when(chMock.close()).thenReturn(promise);
node.connect(address);
node.close();
promise.setSuccess();
node.connect(address);
}
該測試結果在一NullPointerException
在DefaultPromise.notifyListeners()
。因此我的問題是,我如何測試取決於ChannelFutureListener
的代碼?
如果不發表評論,謝謝! – kunerd 2014-10-29 09:18:40
我對Netty並不熟悉,所以我不知道它來自哪裏,但是'DefaultPromise.notifyListeners()'看起來像一個靜態方法調用,可能也需要被調用。如果你使用普通的Mockito,你將無法嘲笑靜態,私人等方法。不過你可以用PowerMockito來做到這一點。 – Morfic 2014-10-29 13:45:45