2

我一直在使用 JUnit 和 Mockito 来尝试测试特定网络模块如何影响其输入和输出流。为了便于测试,我创建了一组模拟网络对象流(即ObjectInputStream的一个实例和ObjectOutputStream的一个实例),并以类似于以下代码片段的方式删除我想要测试的方法:

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import static org.mockito.Mockito.*;
import org.junit.Test;  

public class NetworkTester
{
    @Test
    public void ModuleRespondsToServerRequest() throws Exception
    {
        ObjectInputStream mockClientIn = mock(ObjectInputStream.class);
        ObjectOutputStream mockClientOut = mock(ObjectOutputStream.class);

        when(mockClientIn.readObject()).thenReturn("Sent from Server");

        // Initialize module and connect it to the network...

        verify(mockClientOut, timeout(100).atLeastOnce()).writeObject(isNotNull());
    }
}

但是,当我尝试编译和运行此代码时,我在“when(mockClientIn.readObject()).thenReturn("Sent from Server");”行得到一个空指针异常。我相信这是由于“readObject()”函数在存根对象上调用时返回一个空指针,但我不知道是否可以绕过这种行为。

有没有办法使用 Mockito 存根这个函数(或类似的 null 返回函数)?在此先感谢您的帮助。

4

2 回答 2

2

Mockito 不能模拟readObject(),因为它是最终的。您可以尝试PowerMockito或考虑重新设计您的代码以便于测试。在此处查看有关该主题的讨论。

于 2013-02-13T22:09:10.770 回答
2

如果您查看源代码,您会注意到该方法是最终的。

public final Object readObject()

尝试用另一个对象包装依赖项。请参阅:最终方法模拟

于 2013-02-13T22:09:27.237 回答