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