在Mockito中挖掘出一个无效的函数

时间:2013-02-13 21:36:50

标签: java mockito

我一直在使用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(”从服务器发送“);”行中得到一个空指针异常。我相信这是由于“readObject()”函数在存根对象上调用时返回空指针的事实引起的,但我不知道是否可以绕过此行为。

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

2 个答案:

答案 0 :(得分:2)

Mockito无法模仿readObject(),因为它是最终的。您可以尝试PowerMockito或考虑重新设计代码以便于测试。查看有关主题here的讨论。

答案 1 :(得分:2)

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

public final Object readObject()

尝试使用其他对象包装依赖项。 请参阅:Final method mocking