java - 返回 Future<Void> 的调用在单元测试中抛出 NPE

标签 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上得到了一个N​​PE。目的。我想不出任何when()可以成功返回我模拟的代码 Future或类似的东西。我怎样才能得到这个?

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

注意! client不是自动连接到 MyServer,而是初始化并在 MyServer 的构造函数中打开连接。我也无法控制(非最终)disconnect()调用返回 Future<Void> .

最佳答案

简单的怎么样:

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

或者我在这里忽略了一些东西?你可以验证方法调用,那为什么你认为你不能模拟它呢?!

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

(除非 MyClientdisconnect() 是最终版本。那么您需要使用支持“final-mocking”作为实验功能的较新版本的 Mockito 2)

关于java - 返回 Future<Void> 的调用在单元测试中抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841117/

相关文章:

java - Mockito RETURNS_SMART_NULLS 回答奇怪的行为

java - 在 Valid Anagram 程序中没有通过所有测试用例

scala - 模拟返回 fs2.Stream 的方法

java - Mockito - 当... then通过传递期望值列表多次返回

c# - Quartz Job Scheduler 不触发作业 (C#)

unit-testing - 在grails中模拟外部http请求

javascript - 如何用 Jasmine 部分检查对象

java - Arrays在Java的ByteCode中是如何工作的

java - 求 2000000 以下的素数之和

java - 如何对包含对象列表的对象列表进行分页