Mockito不退还我需要的东西

时间:2018-08-24 15:31:48

标签: java junit mockito

public class ConnectionPointTest {

    @Test
    public void testMockito() throws IOException {

        DataInputStream dataInputStream = mock(DataInputStream.class);
        when(dataInputStream.readUTF()).thenReturn("Test");
        new JustTest(dataInputStream).doTest();

    }

    public class JustTest {
        DataInputStream dataInputStream;

        public JustTest(DataInputStream dataInputStream) {
            this.dataInputStream = dataInputStream;
        }

        public void doTest() throws IOException {
            String s = dataInputStream.readUTF();
            System.out.println(s);
        }
    }
}

我在项目中实现了JUnit测试+ Mockito。然后我尝试模拟我的DataInpuStream,在此代码中我有一个例外:

 when(dataInputStream.readUTF()).thenReturn("Test");

P.S。 JustTest类仅用于向您展示我要模拟的内容。

有例外:

java.lang.NullPointerException
    at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:337)
    at java.io.DataInputStream.readUTF(DataInputStream.java:589)
    at java.io.DataInputStream.readUTF(DataInputStream.java:564)
    ...

1 个答案:

答案 0 :(得分:3)

您正在尝试模拟最终方法:

public final String readUTF() throws IOException {
    return readUTF(this);
}

Mockito(v2.x)支持此功能,但需要其他配置。更多详细信息in the docs

  

模拟最终课程和方法是一项令人振奋的选择功能。它结合使用Java代理工具和子类,以实现这些类型的可模拟性。由于此功能与我们当前的机制不同,并且此机制具有不同的局限性,并且我们希望收集经验和用户反馈,因此必须明确激活此功能才能使用;通过创建包含单行的文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker,可以通过模仿扩展机制完成此操作:

     

mock-maker-inline

因此,创建一个名为org.mockito.plugins.MockMaker的文件,其内容如下:

mock-maker-inline

将此文件放置在测试类路径上名为mockito-extensions的文件夹中(如果使用Maven,只需在src/test/resources中创建此文件夹)

重新运行测试。

使用此配置后,我已成功通过以下方式运行您的测试:

  • JUnit 4.12
  • Mockito 2.7.19