我试图对我的一些客户端代码进行单元测试,如下所示:
@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"
来电。
答案 0 :(得分:2)
简单来说:
when(client.disconnect()).thenReturn(mockedFuture);
或者我在这里忽略了什么?你可以验证方法调用,那么为什么你认为你不能嘲笑它?!
client
对象是您的对象。你已经嘲笑过了。那么是什么让你认为你无法控制其disconnect()
方法呢?在你的模拟上调用该方法;它返回一个值,所以你可以嘲笑它!
(除非MyClient
或disconnect()
是最终版。然后您需要使用较新版本的Mockito 2支持&#34;最终模拟&#34;作为实验性功能)
答案 1 :(得分:0)
NullPointerException
是因为模拟对象的默认行为是返回null。
因此,disconnect()
方法从client
模拟返回null。
假设client
类中@Autowired
为MyServer
而且disconnect()
client
方法既不是静态的也不是最终的(似乎是这种情况),
您可以模拟disconnect()
对象,然后定义@Mock
Future<Void> mockFuture;
方法的行为。
将此变量添加到测试中:
client
将此行为添加到模拟doReturn(mockFuture).when(client).disconnect();
@import url("desktop/desktop") only screen and (min-device-width: 769px);