[英]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 進行編碼的缺點是您有隱藏的依賴關系,需要使用非標准技術進行測試。
我的建議是看看您是否可以公開依賴項。 有幾種方法可以做到這一點。
ObjectInputStream
傳遞到 function 而不是創建您自己的。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.