繁体   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