NockPointerException当Mockito嘲笑ObjectOutputStream.writeObject吗?

ape*_*ker 0 java junit mocking objectoutputstream mockito

我正在编写一个jUnit测试,检查类将什么写入ObjectOutputStream。

具体来说,我正在检查一个类是否正在以某种类型调用writeObject:

ObjectOutputStream out = mock(ObjectOutputStream.class);

out.writeObject(new Something());

verify(out).writeObject(isA(Something.class));
Run Code Online (Sandbox Code Playgroud)

但是Java抱怨里面有NullPointerException writeObject

我需要存根解决此问题吗?

Jef*_*ica 5

Mockito无法做到这一点。根据ObjectOutputStream javadocs,该writeOutput方法是最终的:

public final void writeObject(Object obj) throws IOException
Run Code Online (Sandbox Code Playgroud)

在内部,Mockito实际上通过创建Proxy来模拟这些对象,该Proxy动态覆盖ObjectOutputStream。由于该writeObject方法是最终方法,因此您将无法覆盖或模拟该方法,而Java会调用该方法。这被列为Mockito限制之一

尽管您可以进行验证writeObjectOverride,但是更好的选择实际上是重构代码,以直接使用ObjectOutput接口而不是ObjectOutputStream 接口。ObjectOutputStream实现ObjectOutput,而Mockito可以模拟接口的任何方法。