【问题标题】:Stubbing Out a Null-Returning Function in Mockito在 Mockito 中存根返回 Null 函数
【发布时间】:2013-02-14 06:09:27
【问题描述】:

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

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 返回函数)?提前感谢您的帮助。

【问题讨论】:

  • 这就是 Mockito 的工作方式,也是您指定行为的方式。具体的堆栈跟踪是什么?

标签: java mockito


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    public final Object readObject()
    

    尝试用另一个对象包装依赖项。 见:Final method mocking

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      相关资源
      最近更新 更多