如何validation不同参数的多个方法调用

我有以下方法,我希望validation行为

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() )); ... } 

在我的@Test类,我希望做这样的事情来validationerrors.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", org.apache.struts.action.ActionError@38063806 ); 

我怎么能告诉Mockito检查两个值?

进一步阅读导致我尝试使用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")); 

如果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)); 

尝试这样的事情:

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

你的代码中可能有问题。 因为事实上你实际上写这个代码:

 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()); 

请注意,第一次validation甚至没有按照实际的调用顺序。

另外,我会build议你实际上不要模拟你不拥有的types,例如strutstypes。

[EDIT @Brad]

在我的IDE中运行Brice的代码(上面)后,我可以看到我使用了ActionError而不是ActionMessage,所以这就是为什么我的verify()不匹配。 我最初发布的错误消息误导了我,认为这是第一个不匹配的参数。 原来这是第二个参数。

所以我的问题的答案是

 /** * 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)); 

你可以使用Mockito.atLeastOnce()来允许Mockito通过testing,即使这个mockObject会被调用很多次。

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