调用返回Future <void>在单元测试中抛出NPE

时间:2017-08-23 13:27:27

标签: java unit-testing mockito future

我试图对我的一些客户端代码进行单元测试,如下所示:

@Override
public void stop() {

    if (client != null) {
        Future<Void> disconnectClient = client.disconnect();

        try {
            disconnectClient.await();
        } catch (InterruptedException e) {
            logger.info("Failed to disconnect client: ", e.getLocalizedMessage());
        }
    } else {
        logger.error("Client does not exist.");
    }
}

disconnect()返回Future<Void>的位置。一个简单的测试看起来像:

@Mock
private MyClient client;

@InjectMocks
private MyServer objectUnderTest = new MyServer();

@Test
public void shouldCallDisconnectOnClientWhenDefined() throws Exception {
    objectUnderTest.stop();
    verify(client, times(1)).disconnect();
}

当我运行它时,我显然在Future对象上获得了一个NPE。我想不出任何when()代码可以成功地给我一个模拟Future或类似的东西。我怎么能得到这个?

MyServer包含client连接器,在初始化MyServer时连接到外部服务器。可以通过MyServer创建多个client,每个MyServer都有自己的通道到外部服务器。 MyServerRegistry的所有实例都由client维护。当不再需要连接时,MyServer将断开连接,并从注册表中删除client实例。

注意! MyServer未自动装入MyServer,而是在disconnect()的构造函数中初始化和连接。我也无法控制返回Future<Void>的(非最终) android:layout_width="match_parent" android:layout_height="match_parent" 来电。

2 个答案:

答案 0 :(得分:2)

简单来说:

when(client.disconnect()).thenReturn(mockedFuture);

或者我在这里忽略了什么?你可以验证方法调用,那么为什么你认为你不能嘲笑它?!

client对象是您的对象。你已经嘲笑过了。那么是什么让你认为你无法控制其disconnect()方法呢?在你的模拟上调用该方法;它返回一个值,所以你可以嘲笑它!

(除非MyClientdisconnect()是最终版。然后您需要使用较新版本的Mockito 2支持&#34;最终模拟&#34;作为实验性功能)

答案 1 :(得分:0)

NullPointerException是因为模拟对象的默认行为是返回null。 因此,disconnect()方法从client模拟返回null。

假设client类中@AutowiredMyServer而且disconnect() client方法既不是静态的也不是最终的(似乎是这种情况), 您可以模拟disconnect()对象,然后定义@Mock Future<Void> mockFuture; 方法的行为。

将此变量添加到测试中:

client

将此行为添加到模拟doReturn(mockFuture).when(client).disconnect();

@import url("desktop/desktop") only screen and (min-device-width: 769px);