Как проверить несколько вызовов методов с разными параметрами
у меня есть следующий метод, который я хочу проверить поведение на
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() - Это называется с "исключением.сообщение" и снова с "исключением.подробно"
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, чтобы проверить оба значения?
5 ответов:
дальнейшее чтение привело меня к попытке использовать 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());Примечание первая проверка даже не в порядке в отношении фактических вызовов.
кроме того, я бы рекомендовал вам на самом деле не издеваться над типами, которыми вы не владеете, например, типом стоек.
[EDIT @Brad]
после запуска кода Брайса (выше) в моей IDE я вижу, что я использовал 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 пройти тест, даже если этот mockObject будет вызван много раз.Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(1)); Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(2));
Comments