簡體   English   中英

用於 ObjectInputStream 的 Mockito 和 PowerMock

[英]Mockito and PowerMock for ObjectInputStream

我正在嘗試測試一種使用ObjectInputStream從文件中讀取數據的方法,但我想對ObjectInputStream使用模擬。 這個要測試的方法每次調用都會實例化一個新的ObjectInputStream ,所以我需要對mocking的構造函數使用PowerMock,這樣每次實例化一個ObjectInputStream都會是一個mock。 這是我到目前為止所擁有的:

@Test
public void test() throws Exception {
    ObjectInputStream inputStream = mock(ObjectInputStream.class);
    when(inputStream.readObject()).thenReturn(object);
    PowerMockito.whenNew(ObjectInputStream.class).withAnyArguments().thenReturn(inputStream);
    myFun() // call method to be tested   
}

但是,由於某種原因,這不起作用,因為我在when(inputStream.readObject())得到 NullPointerException ,我不知道為什么。 關於如何模擬ObjectInputStream的任何想法?

@Test
    public void test() throws Exception {
        Object object = mock(Object.class);
        ObjectInputStream inputStream = mock(ObjectInputStream.class);
        when(inputStream.readObject()).thenReturn(object);
        PowerMockito.whenNew(ObjectInputStream.class).withAnyArguments().thenReturn(inputStream);
        myFun() // call method to be tested   
    }

您是否在其他地方創建了 object?

你的測試應該反對什么?

您的聲明“每次調用此要測試的方法都會實例化一個新的 ObjectInputStream”,這意味着您可以提高其可測試性。 對具體的 class 進行編碼的缺點是您有隱藏的依賴關系,需要使用非標准技術進行測試。

我的建議是看看您是否可以公開依賴項。 有幾種方法可以做到這一點。

  1. 將您的ObjectInputStream傳遞到 function 而不是創建您自己的。
  2. Function<ObjectInputStream,FileInputStream>字段添加到 class 以便您可以模擬新實例而無需借助 PowerMock。

還要考慮是否可以編碼到ObjectInput接口而不是具體的 class。

如果您選擇選項 2。您的測試可能看起來像:

ObjectInput mockObjectInput = mock(ObjectInput.class);
when(mockObjectInput.readObject()).thenReturn(object);    
ClassUnderTest testInstance = new ClassUnderTest(fis -> mockObjectInput);
testInstance.methodUnderTest();
verify...

在我看來,這將使您的測試更具可讀性並且依賴性更加明確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM