2014-10-29 32 views
0

我正在使用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); 
} 

該測試結果在一NullPointerExceptionDefaultPromise.notifyListeners()。因此我的問題是,我如何測試取決於ChannelFutureListener的代碼?

+0

如果不發表評論,謝謝! – kunerd 2014-10-29 09:18:40

+0

我對Netty並不熟悉,所以我不知道它來自哪裏,但是'DefaultPromise.notifyListeners()'看起來像一個靜態方法調用,可能也需要被調用。如果你使用普通的Mockito,你將無法嘲笑靜態,私人等方法。不過你可以用PowerMockito來做到這一點。 – Morfic 2014-10-29 13:45:45

回答

1

我找到了解決問題的方法。如果通道的模擬(chMock)被替換爲實際通道,例如EmbeddedChannel,則該模式起作用。之後,我使用spy作爲頻道而不是模擬。

這是我目前的解決方案:

@Test 
public void testConnectAfterClose() { 
    Channel helper = new EmbeddedChannel(mock(ChannelHandler.class)); 
    chMock = spy(helper); 

    when(chMock.close()).thenReturn(promise); 
    node.connect(address); 
    node.close(); 
    promise.setSuccess(); 
    node.connect(address); 
} 

@Morfic:謝謝你的評論。這是我目前解決方案的一個很好的提示。

+0

沒問題,很高興我能幫到 – Morfic 2014-10-31 08:38:06

+0

也爲我工作 – 2017-02-20 12:45:45