2013-10-18 137 views
1

我是新來的Android的測試,並已決定通過實例的Mockito從http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#3參數匹配不驗證參數

工作要充分認識發生了什麼事情開始,我已經決定從分支出來例如,這是我的代碼:

@Test 
public void testMatchers() throws Exception 
{ 
    LinkedList <String> mockedList = mock (LinkedList.class); 
    when (mockedList.contains(argThat(isValidStr()))).thenReturn(true); 
    System.out.println(mockedList.contains("Asdf")); // prints 'true', as expected 
    System.out.println(mockedList.contains("asdf")); // prints 'true' which I guess makes sense... but shouldn't the argument matcher complain somehow? 

} 
public static ArgumentMatcher<String> isValidStr() 
{ 
    return new ArgumentMatcher<String>() 
    { 
    @Override 
    public boolean matches (Object argument) 
    { 
     String str = (String) argument; 
     return (str.charAt(0) > 'A' || str.charAt(0) < 'Z') // if first letter is capitalized 
    } 
    } 
} 

所有測試都通過,有0個例外/錯誤。另外,我在「匹配」功能的開始處放置了一個斷點,並且它永遠不會被擊中。

3個問題: 1)爲什麼我的參數匹配器不抱怨錯誤的爭論?
2)檢測到錯誤的參數後,預期的輸出是多少? 3)代碼如何看起來像檢測一個不合適的參數?

回答

1
  1. 我不知道爲什麼你的斷點不點火,但是我扔在匹配一個System.out.println("Hello")斷點,它被擊中就好了。事實證明,在您的測試中,「asdf」和「Asdf」都是匹配的,因爲您在匹配器中的條件是||而不是&&。有一次,我糾正了,並切換到>=<=代替><

    return (str.charAt(0) >= 'A' && str.charAt(0) <= 'Z'); 
    

    ...然後我得到分別與truefalse,符合市場預期。

    需要注意的是它的安全一樣ListDeque模擬接口,而不是具體的類象LinkedList,因爲具體的類可以有默默的Mockito不能嘲笑最終方法。由於您使用的匹配在when聲明(在現實世界中的非示例測試你應該使用一個真正的LinkedListtest state instead of interaction。)

  2. ,你設置的匹配相匹配時,預期的行爲。如果不匹配,如果您沒有設定其他期望,Mockito會返回default boolean return value,false

  3. Unlike EasyMock's record-replay pattern,在測試過程中積極捕捉不良相互作用,的Mockito有存根測試驗證模式,對於不良的相互作用只有「檢查」,如果你手動要求它這樣做:

    // Verify that contains is never called with an invalid string. 
    verify(mockedList, never()).contains(argThat(not(isValidStr())); 
    

    通過約定,這將在你的測試結束。另一個明顯的驗證應該是這樣的:

    verify(mockedList).contains(argThat(isValidStr())); 
    

    ...但是這實際上會通過,因爲它會與「ASDF」匹配您的第一個電話,而忽略你用「ASDF」第二個電話。您可以通過在上面的驗證中添加verifyNoMoreInteractions(mockedList)來解決此問題,但通常那些默認值(如falsenull)無論如何都會破壞您的測試斷言或系統測試。