我正在编写一个jUnit测试,检查一个类写入ObjectOutputStream的内容。
具体来说,我正在检查一个类是否正在使用某种类型调用 writeObject:
ObjectOutputStream out = mock(ObjectOutputStream.class);
out.writeObject(new Something());
verify(out).writeObject(isA(Something.class));
但是Java抱怨writeObject
内部的NullPointerException。
我需要存根什么来解决这个问题?
这在 Mockito 中是不可能的。根据 ObjectOutputStream javadocs,writeOutput
方法是最终的:
public final void writeObject(Object obj) throws IOException
在内部,Mockito实际上通过创建一个代理来模拟这些对象,该代理动态覆盖ObjectOutputStream。但是,由于writeObject
方法是最终的,因此您无法覆盖或模拟它,并且Java调用原始方法。这被列为Mockito的限制之一。
虽然你可以验证writeObjectOverride
,但你更好的选择实际上是重构你的代码以使用接口ObjectOutput而不是直接使用ObjectOutputStream。ObjectOutputStream 实现了 ObjectOutput,Mockito 可以模拟接口的任何方法。