У меня есть следующий метод, на котором я хочу проверить поведение.
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 я надеялся сделать что-то подобное, чтобы проверить, что это errors.add()
вызывается с помощью «exception.message» и снова с «exception.detail»
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
однако Мокито жалуется на следующее
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, чтобы он проверял оба значения?
Mockito.reset()
Ответы:
Дальнейшее чтение побудило меня попробовать использовать ArgumentCaptors и следующие работы, хотя и гораздо более подробные, чем мне хотелось бы.
источник
methodToTest()
ровно один раз, поэтому этот ответ действительно подтверждает, что два вызова выполняются вместе. ЗахваченныйList<String> values
, который утверждается, будет содержать только два тестируемых значения и никаких других. Вы также можете добавитьassertTrue(values.size == 2)
. Если это то, что вы хотите, я бы заменил 3 утверждения assertTrue одним Hamcrest ...assertThat(values, contains("exception.message", "exception.detail"));
methodToTest()
один раз. Это аргумент метода,ActionErrors errors
который внутренне вызывается дважды.Если порядок обоих
add()
вызовов актуален, вы можете использоватьInOrder
:источник
errors
аргумент:InOrder inOrder = inOrder(errors);
(см. Документацию )List
вSet
и утверждают , что набор входов равно множество , задаваемое аргументом захватами.Попробуйте что-то вроде этого:
источник
у вас вероятно есть проблема в вашем коде. Потому что на самом деле вы пишете этот код:
Обратите внимание, что первая проверка не выполняется даже в отношении фактических вызовов.
Кроме того, я бы порекомендовал вам на самом деле не имитировать типы, которыми вы не владеете, например, тип struts.
[ИЗМЕНИТЬ @Brad]
После запуска кода Брайса (см. Выше) в моей среде IDE я вижу, что я использовал ActionError вместо ActionMessage, поэтому мой verify () не соответствовал. Сообщение об ошибке, которое я изначально опубликовал, вводило меня в заблуждение, заставляя думать, что это был первый несоответствующий аргумент. Оказывается, это был второй аргумент.
Итак, ответ на мой вопрос
источник
InOrder
.Вы можете использовать,
Mockito.atLeastOnce()
который позволяет Mockito пройти тест, даже если этот mockObject будет вызываться много раз.источник
1) Сообщите Mokito ожидаемое общее количество звонков.
2) Сообщите Mokito, сколько раз каждая комбинация параметров ожидалась.
источник
Аналогично @ sendon1928 мы можем использовать:
чтобы метод вызывал точное количество раз (на мой взгляд, предпочтительное решение). После мы можем позвонить
Чтобы убедиться, что этот макет больше не использовался ни в каком контексте. Полный пример:
источник