我是新來的單元測試,並試圖學習正確的風格。我喜歡設置我正在測試的對象,以便我可以測試它,好像它正在使用中,而不是僅測試新構造的對象。我無法測試從空對象中移除東西,因爲許多對象在構建時都是如此。在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
,我的測試中得到複雜,更長和少集中,所以很明顯,我做錯了。
這是什麼做正確的樣子?
這會讓我的測試更加寬容。那是不是宣佈ObservedList被允許向ListListener發送不正確的消息?我不想這樣做。如果放任是一件好事,我可以完全消除測試,允許一切,這是最簡單的,但我真的想實際測試這個東西。 – Geo
@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),它傾向於對易碎,嚴格指定的測試進行靈活,鬆散的測試。通常情況下,除非您正在測試偵聽器或回調行爲,否則額外的方法調用不應導致測試失敗:在您期待和驗證每個調用時,您已在測試內部複製了實現。 –
@JeffBowman,這是否意味着Mockito不應該被用來嘲笑聽衆或回調?它似乎只是用於自己的測試理念,但我毫不猶豫地使用了多種模擬工具。 – Geo