2011-06-23 30 views
6

我正在學習Mockito,我正在做的一件事是鞏固我的學習,就是將舊的JUnit測試從使用手動模擬類轉換爲使用Mockito模擬類的測試。但是,我遇到了我不知道如何處理的情況。是否可以查詢傳遞給Mockito模擬對象的參數?

具體來說,我的被測單元會構造一個String,它將作爲方法調用的參數傳遞給模擬對象。我想測試String構造正確。挑戰在於String的一部分是一個散列鍵,它在內部生成並在每次調用時發生變化。一種可行的解決方案是在我的控制下獲得哈希生成,併爲測試執行注入虛擬生成器。但是,這是一個相當的工作。

我的舊手卷模擬類將存儲傳遞給它的參數,我可以在我的測試中查詢。這讓我通過以下查詢String的起點和終點:

assertTrue(mockFtpClient.getFilePathAndName().startsWith("/data/inbound/XJSLGG.")); 
assertTrue(mockFtpClient.getFilePathAndName().endsWith(".pdf")); 

這是的一個充分足夠的測試對我的口味。所以我的問題是,是否有可能使用Mockito來查詢或獲取傳遞給方法的參數,以便我可以執行類似於上面的操作?

UPDATE 24/06/2011: 在這一點上,我已經例外了Gnon的答案。但是,我發現了一些對我更好的東西。即ArgumentCaptor。下面是它如何工作的:

ArgumentCaptor<String> fileNameArgument = ArgumentCaptor.forClass(String.class); 
verify(mockFtpClient).putFileOnServer(fileNameArgument.capture()); 
assertTrue(fileNameArgument.getValue().startsWith(START_FILE_NAME) && 
      fileNameArgument.getValue().endsWith(END_FILE_NAME)); 

爲國家的Mockito的Javadoc是ArgumentCaptor通常是一個更好的選擇,當你有一個一次性的特定參數的匹配要求,因爲我在這裏做的。

+1

感謝您的更新,我不知道ArgumentCaptor。 –

+0

ArgumentCaptor將改變我的(編碼)生活! –

回答

3

基本上你需要使用argThat()中的Mockito,讓您治療Hamcrest 匹配器作爲驗證參數。這裏是你使用,使有關傳入的參數定製的斷言代碼:

@Test 
public void testname() throws Exception { 
    HashReceiver receiver = mock(HashReceiver.class); 
    receiver.set("hash"); 
    verify(receiver).set(argThat(new HashMatcher())); 
} 

class HashMatcher extends BaseMatcher<String> { 
    @Override 
    public boolean matches(Object item) { 
     String hash = (String) item; 
     if (hash.startsWith("/data/inbound/XJSLGG.") && hash.endsWith(".pdf")) 
      return true; 
     return false; 
    } 
} 

// Mocked 
class HashReceiver { 
    public void set(String hash) { 
    } 
} 

您可以使用一個通用的匹配,而不是,或通用的匹配組合。

+0

感謝Gnon,我認爲這個解決方案非常適合我需要的功能。恥辱其額外的代碼,但這不是一個常見的情況。 –

+0

這是您可以在其中找到argThat()方法的地方:http://docs.mockito.googlecode.com/hg/latest/org/mockito/Matchers.html#argThat(org.hamcrest.Matcher)。你的導入應該是'import static org.mockito.Matchers.argThat;' –

相關問題