2016-03-09 85 views
0
的Mockito

我想測試這個代碼的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

你想測試什麼?你可以測試你的模擬,這是沒有意義的。如果你想測試你的方法,你需要運行它。這意味着你需要運行你的線程......如果你想測試這個方法屬性,你需要重構它。 – Tunaki

+0

http://stackoverflow.com/questions/9841623/mockito-how-to-verify-method-was-called-on-an-object-created-within-a-method –

+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界面一起使用此想法。