gpt4 book ai didi

java - 模拟 ObjectInputStream

转载 作者:行者123 更新时间:2023-12-04 22:00:03 26 4
gpt4 key购买 nike

当我尝试模拟 ObjectInputStream 对象时,我得到一个 NullPointerException。更准确地说,当调用此行时: when(inputStream.readObject()).thenReturn(new Person("Doe", "John", "123"));

代码片段:

@RunWith(MockitoJUnitRunner.class)
public class ConnectionTest{
...
@Mock
private ObjectInputStream inputStream;
...
@Test
public void test(){
...
when(inputStream.readObject()).thenReturn(new Person("Doe", "John", "123"));
...
}
}

通常,当您初始化 ObjectInputStream 时,您必须将 InputStream 对象作为构造函数参数传递,我敢打赌这就是问题所在 - 没有为 ObjectInputStream 分配 InputStream。

那我应该如何正确地模拟 ObjectInputStream 呢?

最佳答案

这是由于 readObject()最终的

Mockito 不能模拟 final 方法。所以发生的事情是尝试 specify 调用模拟对象......只是出错了。是的,抛出 NPE 的事实不仅仅是误导。

你可以尝试使用那个 experimental Mockito 2 中的 功能允许模拟 final 方法。如果这对您不起作用,PowerMock(ito) 或 JMockit 很可能会完成这项工作。

仅作记录:这些微妙的问题是不再使用 Java 内置序列化的另一个很好的理由。

绕过此问题的唯一其他方法:针对相应的接口(interface)进行编程ObjectInput ,而不是具体的实现类。

因为您可以轻松地模拟该界面

当然,这意味着更改您的生产代码。这可能不是一个坏主意,因为它将您的业务逻辑与 实际 形式的序列化解耦。如果您稍后选择使用 GSON 序列化为 JSON 字符串 - 您只需替换该接口(interface)的实现即可。

关于java - 模拟 ObjectInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45013934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com