Как проверить несколько вызовов методов с разными параметрами



у меня есть следующий метод, который я хочу проверить поведение на



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, чтобы проверить оба значения?

414   5  

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

    Ничего не найдено.