2013-10-18 56 views
1

我是新來的單元測試,並試圖學習正確的風格。我喜歡設置我正在測試的對象,以便我可以測試它,好像它正在使用中,而不是僅測試新構造的對象。我無法測試從空對象中移除東西,因爲許多對象在構建時都是如此。在Mockito中設置後重置模擬的正確選擇是什麼?

以下是一個示例,其中ObservedList正在測試中,ListListener是一個正在被模擬的必需類。

public final class ObservedListTest { 
    private ListListener<Integer> listener; 
    private ObservedList<Integer> list; 
    @BeforeMethod public void setup() { 
    listener = mock(ListListener.class); 
    list = new ObservedList<Integer>(listener); 
    list.addAll(Arrays.asList(1,2,3)); 
    reset(listener); 
    } 
    @Test public void addFirst() { 
    list.add(0, -1); 
    verify(listener).listEdited(list, 0, 1, Collections.<Integer>emptyList()); 
    verifyNoMoreInteractions(listener); 
    } 
    @Test void addAtEnd() { 
    list.add(9); 
    verify(listener).listEdited(list, 3, 4, Collections.<Integer>emptyList()); 
    verifyNoMoreInteractions(listener); 
    } 
    @Test void removeMiddle() { 
    list.remove(Integer.valueOf(2)); 
    verify(listener).listEdited(list, 1, 1, Collections.singletonList(2)); 
    verifyNoMoreInteractions(listener); 
    } 
} 

作爲一個新手,這似乎很好地工作給我,但我知道這是不好的做法,因爲它使用的reset方法。我打電話reset,因爲我不希望實際測試因設置中發生的交互而感到困惑。

reset的Javadoc甚至沒有得到周圍告訴你的方法做什麼,因爲它是那麼忙告訴你,你不應該使用它。通常我會簡單地採取建議和去除我的setup方法和調整我的測試看起來更像這樣避免reset

@Test void removeMiddle() { 
    listener = mock(ListListener.class); 
    list = new ObservedList<Integer>(listener); 
    list.addAll(Arrays.asList(1,2,3)); 
    list.remove(Integer.valueOf(2)); 
    InOrder inOrder = inOrder(listener); 
    inOrder.verify(listener).listEdited(list, 0, 3, 
     Collections.<Integer>emptyList()); 
    inOrder.verify(listener).listEdited(list, 1, 1, 
     Collections.singletonList(2)); 
    verifyNoMoreInteractions(listener); 
    } 

似乎很好地工作給我。問題是,對於reset方法的文檔說:

相反覆位(),請考慮編寫簡單,體積小,集中在漫長的,在規定的試驗 測試方法。

我尊重Mockito旨在鼓勵單元測試的良好風格,並且我想從中學習,但是我很難整理出它想要發送給我的消息。當我消除我的測試reset,我的測試中得到複雜更長少集中,所以很明顯,我做錯了。

這是什麼做正確的樣子?

回答

2

刪除reset。刪除verifyNoMoreInteractions。問題解決了。您的測試更簡單,更短,更專注。

+0

這會讓我的測試更加寬容。那是不是宣佈ObservedList被允許向ListListener發送不正確的消息?我不想這樣做。如果放任是一件好事,我可以完全消除測試,允許一切,這是最簡單的,但我真的想實際測試這個東西。 – Geo

+1

@Geo,Ryan正在描述[Mockito的設計目的](http://monkeyisland.pl/2008/07/12/should-i-worry-about-the-unexpected/) //docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#8),它傾向於對易碎,嚴格指定的測試進行靈活,鬆散的測試。通常情況下,除非您正在測試偵聽器或回調行爲,否則額外的方法調用不應導致測試失敗:在您期待和驗證每個調用時,您已在測試內部複製了實現。 –

+0

@JeffBowman,這是否意味着Mockito不應該被用來嘲笑聽衆或回調?它似乎只是用於自己的測試理念,但我毫不猶豫地使用了多種模擬工具。 – Geo

相關問題