[英]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.