2011-12-14 63 views
55

我有以下的方法,我希望在如何驗證多種方法不同PARAMS調用

public void methodToTest(Exception e, ActionErrors errors) { 

    ... 
     errors.add("exception.message", 
        ActionMessageFactory.createErrorMessage(e.toString())); 

     errors.add("exception.detail", 
        ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString())); 

    ... 
} 

驗證的行爲在我的@測試類我希望做這樣的事情,以驗證errors.add()被稱爲與 「exception.message」,並再次以 「exception.detail」

verify(errors).add(eq("exception.message"), any(ActionError.class)); 
verify(errors).add(eq("exception.detail"), any(ActionError.class)); 

然而抱怨的Mockito如下

Argument(s) are different! Wanted: 
actionErrors.add(
    "exception.message", 
    <any> 
); 

Actual invocation has different arguments: 
actionErrors.add(
    "exception.detail", 
    [email protected] 
); 

我如何告訴Mockito檢查兩個值?

+0

當你有兩種不同的簽名方法時,你可以爲它們分別編寫測試用例。 – 2011-12-14 12:01:10

+1

是的,但在這種情況下,它有相同的方法簽名,但只是不同的參數值 – Brad 2011-12-14 13:30:54

回答

55

進一步閱讀使我使用ArgumentCaptors及以下作品的嘗試,但更詳細的比我想的。

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); 

verify(errors, atLeastOnce()).add(argument.capture(), any(ActionMessage.class)); 

List<String> values = argument.getAllValues(); 

assertTrue(values.contains("exception.message")); 
assertTrue(values.contains("exception.detail")); 
17

嘗試這樣:

verify(errors, times(2)) 
    .add(AdditionalMatchers.or(eq("exception.message"), eq("exception.detail")), 
      any(ActionError.class)); 
14

你可能在你的代碼中的問題。因爲事實上,你真正編寫代碼:

Map<Character, String> map = mock(Map.class); 

map.put('a', "a"); 
map.put('b', "b"); 
map.put('c', "c"); 

verify(map).put(eq('c'), anyString()); 
verify(map).put(eq('a'), anyString()); 
verify(map).put(eq('b'), anyString()); 

注意首先驗證甚至不是爲了在實際調用的方面。另外,我會建議你實際上不要模擬你不擁有的類型,例如struts類型。

[編輯@Brad]

在我的IDE中運行布萊斯的代碼(上圖)後,我可以看到,我已經使用ActionError代替ActionMessage的,所以這就是爲什麼我的驗證()不匹配。我最初發布的錯誤消息誤導了我,認爲這是第一個不匹配的參數。原來它是第二個參數。

所以回答我的問題是

/** 
* note that ActionMessageFactory.createErrorMessage() returns ActionMessage 
* and ActionError extends ActionMessage 
*/ 
verify(errors).add(eq("exception.message"), any(ActionMessage.class)); 
verify(errors).add(eq("exception.detail"), any(ActionMessage.class)); 
+0

不會得到你想說的。驗證的順序是否重要?如果驗證順序很重要。那麼爲什麼這裏提供了InOrder API? – 2016-11-04 13:04:58

31

如果兩個add()調用的順序是相關的,你可以使用InOrder

InOrder inOrder = inOrder(errors, errors); 
inOrder.verify(errors).add(eq("exception.message"), any(ActionError.class)); 
inOrder.verify(errors).add(eq("exception.detail"), any(ActionError.class)); 
3

您可以使用Mockito.atLeastOnce()允許的Mockito通過,即使該mockObject將被調用多次測試。

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(1)); 

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(2)); 
相關問題