如何使用Mockito

时间:2016-03-09 16:13:45

标签: java mockito testng resteasy

我正在尝试使用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总是为空。有没有办法断言响应,或者我只是不得不省略这个测试的断言?

1 个答案:

答案 0 :(得分:1)

Slave作为界面。创建它的2个实现:例如RealSlaveMockSlave。在真实系统中使用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接口。