我正在尝试使用Mockito测试此代码:
@Override
public Response killServer() {
new Thread(new Runnable() {
@Override
public void run() {
Slave slave = SlaveRunner.getSlave();
slave.initiateShutdown();
}
}).start();
String host = System.getenv("HOSTNAME");
return Response.ok().entity(new String ("Stopping REST service on " + host)).build();
}
我无法在单元测试中运行此功能,因为系统将退出。 initiateShutdown()
方法执行System.exit();
。我用这个类嘲笑了这个课:
@Test
public void killServer() throws RestInterfaceException {
SlaveRestInterface mockedAgent = Mockito.mock(SlaveRemoteProxy.class);
Response r = Mockito.mock(Response.class);
Mockito.when(mockedAgent.killServer()).thenReturn(r);
Assert.assertEquals(r.readEntity(String.class), "Stopping REST service on " + System.getenv("HOSTNAME"));
r.close();
}
我不能像这样做断言,因为r总是为空。有没有办法断言响应,或者我只是不得不省略这个测试的断言?
答案 0 :(得分:1)
将Slave
作为界面。创建它的2个实现:例如RealSlave
和MockSlave
。在真实系统中使用RealSlave
实例,在测试中使用MockSlave
。虽然在测试中调用MockSlave#initiateShutdown()
但什么也没做,只是检查方法是否真的被调用。
Slave slave = Mockito.mock(Slave.class);
Mockito.doNothing().when(slave).initiateShutdown();
...
initiate `killServer` call somehow
...
Mockito.verify(slave).initiateShutdown();
通过这种方法,您可以确保killServer
以适当的方式与Slave
实施互动。显然,您当前的实现应该重新使用Slave
接口。