Mockito模拟ObjectOutputStream.writeObject时出现NullPointerException?

时间:2013-09-19 17:24:21

标签: java junit mocking mockito objectoutputstream

我正在编写一个jUnit测试,检查一个类写入ObjectOutputStream的内容。

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

ObjectOutputStream out = mock(ObjectOutputStream.class);

out.writeObject(new Something());

verify(out).writeObject(isA(Something.class));

但是Java抱怨writeObject内的NullPointerException。

我需要什么来解决这个问题?

1 个答案:

答案 0 :(得分:5)

Mockito无法做到这一点。根据{{​​3}},writeOutput方法是最终的:

public final void writeObject(Object obj) throws IOException

在内部,Mockito实际上通过创建ObjectOutputStream javadocs来嘲笑这些对象,它会动态覆盖ObjectOutputStream。但是,因为writeObject方法是最终的,所以您无法覆盖或模拟它,Java会调用原始方法。这被列为Proxy之一。

虽然您可以对writeObjectOverride进行验证,但实际上更好的做法是重构代码以直接使用接口limitations of Mockito而不是ObjectOutputStream。 ObjectOutputStream实现ObjectOutput,Mockito可以模拟接口的任何方法。