2013-02-13 28 views
2

我一直在使用JUnit和Mockito來試圖測試一個特定的網絡模塊如何影響它的輸入和輸出流。爲了便於測試,我創建了一組模擬網絡對象流(即ObjectInputStream的實例和ObjectOutputStream的實例),並以類似於以下代碼片段的方式將我想要測試的方法刪除:在Mockito中剔除返回null的函數

import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import static org.mockito.Mockito.*; 
import org.junit.Test; 

public class NetworkTester 
{ 
    @Test 
    public void ModuleRespondsToServerRequest() throws Exception 
    { 
     ObjectInputStream mockClientIn = mock(ObjectInputStream.class); 
     ObjectOutputStream mockClientOut = mock(ObjectOutputStream.class); 

     when(mockClientIn.readObject()).thenReturn("Sent from Server"); 

     // Initialize module and connect it to the network... 

     verify(mockClientOut, timeout(100).atLeastOnce()).writeObject(isNotNull()); 
    } 
} 

然而,當我嘗試編譯並運行這段代碼,我得到了行「的時候(mockClientIn.readObject())thenReturn。(」從服務器發送「)一個空指針異常;」。我相信這是由於「readObject()」函數在存根對象上調用時返回空指針這一事實造成的,但我不知道是否有可能繞過此行爲。

是否有任何方式使用Mockito存根(或類似的空返回函數)?在此先感謝您的幫助。

+0

這就是Mockito的工作原理,這就是您指定行爲的方式。什麼是特定的堆棧跟蹤? – 2013-02-13 21:41:43

回答

2

Mockito不能模擬readObject(),因爲它是最終的。您可以試試PowerMockito或考慮重新設計您的代碼以實現更易於測試。請參閱關於here主題的討論。

2

如果您查看源代碼,您會注意到該方法是最終的。

public final Object readObject() 

嘗試使用另一個對象包裝依賴項。 請參閱:Final method mocking