2015-02-05 68 views
1

我有一個簡單的單元測試,在我測試一個DAO。我嘲笑依賴並通過構造函數將它注入主題。 我需要拆除嗎? Mockito測試是否以與進入設置方法相同的狀態退出?請也解釋一下。在Mockito中嘲笑時,我需要一個拆卸方法嗎?

@Mock 
private PersonDAO dao; 

@Overide 
public void setup(){ 
    MockitoAnnotations.initMocks(this); 
    sut = new PersonResource(dao); 
} 

@Test 
public void testUpdate(){ 
    when(dao.findNameById(1)).thenReturn("Abhinav-before"); 
    sut.update(1, "Abhinav-after"); 
} 
+1

請問您可以顯示代碼嗎?它會簡化很多事情 – DixonD 2015-02-05 17:52:53

+0

<! - language:lang-java - > ' @Mock private personDAO dao; @Overide public void setup(){ MockitoAnnotations.initMocks(this); sut =新的PersonResource(dao); } @Test public void testUpdate(){(dao.findNameById(1)).reReturn(「Abhinav-before」); sut.update(1,「Abhinav-after」); }' 我是否需要拆散爲道模擬? – 2015-02-05 19:07:13

+0

@AbhinavGandhi請勿在評論中發佈相關代碼。請編輯你的問題,幷包括你提供的代碼 – Barranka 2015-02-05 19:14:42

回答

2

除非你在其他國家推動的資源,諸如高速緩存或臨時文件拉動,不需要拆掉嘲諷時的任何資源。

模擬對象只是一個對象;它不具有或維護任何外部服務。它會像您在測試中使用的任何其他對象一樣收集垃圾。依賴於你如何注入模擬,無論如何它都會在每次測試中重新創建。

現在,您提供的代碼一點點,有你使用的@Before註釋,你會確信,無論是模擬被之前注入試運行的每個實例。就目前而言,該測試可能不會編譯;我無法想象這樣一種情況,即您將通過該測試擴展另一種具有setup方法的測試。

(如果你做什麼,請不要。你只會傷害自己。)

最後,斷言在本次測試的東西。你沒有斷言任何東西,所以它會一直通過,除非你斷言你的測試對象的狀態是真實的。

與該位的方式進行,如果使用MockitoJUnitRunner相反,你不需要initMocks一塊,但如果這是你的唯一亞軍作爲JUnit的不支持多個亞軍,這是隻適用。

@RunWith(MockitoJUnitRunner.class) 
public class PersonResourceTest { 
    @Mock 
    private PersonDAO dao; 

    @InjectMocks 
    private PersonResource testObject; 

    @Test 
    public void testUpdate(){ 
     when(dao.findNameById(1)).thenReturn("Abhinav-before"); 
     testObject.update(1, "Abhinav-after"); 
    } 
} 
+0

當你說 - 它是爲每個測試重新創建的,模擬器在測試套件的最後一次測試中被破壞了嗎? – 2015-02-05 18:13:20

+0

模擬 - 連同你實例化的任何其他對象 - 在完成每個單獨的測試後被銷燬。然後,他們在下一次測試開始時重新創建。至少,我從我的經歷和與它的互動中看到了這一點。 – Makoto 2015-02-05 18:14:13

+0

請注意,對於JUnit而言,這可能是正確的,因爲此框架爲每個測試方法創建了一個新實例。然而,TestNG的想法是不同的,並且創建了一個單一的測試實例,並且一個模擬包含調用,存根等等,因此在這種情況下是肯定的,必須有一個'@ AfterMethod'拆卸方法''Mockito.reset (mock1,mock2,...)' – Brice 2015-02-07 10:52:41