我正在尝试对一些客户端代码进行单元测试,如下所示:
@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
可以创建,每个都有自己的通向外部服务器的 channel ,通过它们的 client
。 MyServer
的所有实例由 MyServerRegistry
维护。当不再需要连接时,client
将断开连接,并且 MyServer
从注册表中删除实例。
注意! client
不是自动连接到 MyServer,而是初始化并在 MyServer
的构造函数中打开连接。我也无法控制(非最终)disconnect()
调用返回 Future<Void>
.
最佳答案
简单的怎么样:
when(client.disconnect()).thenReturn(mockedFuture);
或者我在这里忽略了一些东西?你可以验证方法调用,那为什么你认为你不能模拟它呢?!
client
对象是您的 对象。你已经 mock 了它。那么是什么让您认为您无法控制其 disconnect()
方法呢?在你的模拟中调用该方法;它返回一个值,因此您可以模拟它!
(除非 MyClient
或 disconnect()
是最终版本。那么您需要使用支持“final-mocking”作为实验功能的较新版本的 Mockito 2)
关于java - 返回 Future<Void> 的调用在单元测试中抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841117/