Я знаю, что каждый метод, который ничего не делает, не должен тестироваться (или даже не существовать). Дело в том, что мой метод кое-что делает нормально, но для тестового сценария мне приходится издеваться над тем, что он делает. Но я все же хотел бы утверждать параметры, которые он будет отправлять во внешнюю вещь.
Звучит сложнее, чем есть на самом деле. Проверьте мой фрагмент для лучшего понимания:
class A {
@Inject
private Mailer mailer; // Custom mailer class
public void doSomething() {
Date date = new Date(); // dynamic parameter I do not care about in the test
String parameter = "test"; // The parameter I want to test later
mailer.sendMail(parameter, date);
}
}
class ATest {
@Mock
@Produces
private Mailer mailer;
@Inject
private A classToTest;
@Test
public void testDoSomething() throws Exception {
classToTest.doSomething();
assertThat(??).isEqualTo("test"); //How can I get the value of parameter?
}
}
Как видите, мне нужно имитировать мою электронную почту, чтобы я не отправлял электронную почту каждый раз при запуске теста.
Было бы бессмысленно превращать parameter
в глобальную переменную.
Есть ли способ проверить значение parameter
без изменения кода A
? А если нет, что было бы лучшим решением, не испортив мой класс только для тестирования?
@Stultuske Моя почтовая программа издевается, и мне нужно значение parameter
для проверки. Не только если его назвали
поэтому проверьте, вызывается ли он с этим параметром.
Вот что я пытаюсь выяснить. На SO ничего подобного не нашел. @Stultuske
Это не тот сценарий @Stultuske.
да это так. это просто уровень глубже. Теперь вы можете сказать, что это не тот же сценарий, но тогда зачем вам принимать ответ, который говорит вам точно то же самое?
Мой вопрос был: «Как я могу получить доступ к результату пустоты, которая отправляется в издевательскую вещь». Он ответил на это. Этот другой пост StackOverflow этого не делает. Он просто говорит мне, как проверить, что он был вызван (для чего у меня были бы и другие способы) @Stultuske
Пустота не имеет возвращаемого значения, это правильно, но она может привести к чему-то (в этом примере это приводит к отправленному электронному письму). Ссылка, которую вы разместили, не решила мою проблему. Тем не менее, спасибо за вашу помощь и беспокойство.
вы не можете проверить это, вы можете только проверить, что метод был вызван и не было выдано никаких исключений. Принятый вами ответ не проверяет больше, чем это: просто вызывается метод и то, что вы передали в качестве параметра.
parameter == the result
просто чтобы уточнить это для вас...
Вам нужно использовать Mockito.verify
:
verify(mailer, times(1)).sendMail("test");
Verify проверяет, что произошло с вашими макетами: сколько раз был вызван метод и какие аргументы были переданы этому методу.
Обновлять:
Если вы хотите исключить определенные параметры, вы можете использовать org.mockito.Matchers.any
— проще иметь его как статический импорт. (Примечание: если вы игнорируете некоторые параметры, то те, которые вы хотите ВКЛЮЧИТЬ, теперь должны быть заключены в org.mockito.Matchers.eq
).
verify(mailer, times(1)).sendMail(eq("test"), any(Date.class));
Спасибо за помощь, но на самом деле у меня есть несколько параметров для sendMail, и один из них — текущий Date
. Как я могу проверить это parameter == "test"
, но игнорировать дату? Я обновил свой вопрос примером.
Это отвечает на мой вопрос. Спасибо! Я отмечу это как принятое, но один маленький вопрос: вы можете сделать что-то вроде eqContains("te")
?
неважно, я нашел это довольно быстро теперь, когда я знаю об этом. это просто Matchers.contains()
.
Вы также можете посмотреть на ArgumentCaptor
. Допустим, ваш параметр был сложным объектом с множеством полей, а не простой строкой. Вы можете использовать ArgumentCaptor
, чтобы захватить объект, который был передан вашему макету, и затем проверить его. Это гораздо мощнее, но для таких простых проверок, как эта, слишком много.
Спасибо за подсказку!
Один из способов — параметризовать метод doSomething
с помощью изменяемый объект, который вы можете установить при выполнении метода и подтвердить в тестовом методе. В противном случае вы также можете проверить наличие исключений для любого негативного сценария, например
@Test(expected = EmailSendException.class)
public void testDoSomething(){
....
}
это ужасный план. что, если что-то еще вызовет такое исключение? понимаете, они пытаются проверить счастливый поток, а не исключение
Электронная почта издевается, поэтому ничего не выбрасывает. Я мог бы что-то кинуть вручную, но это все равно не позволяло бы мне проверить результат parameter
.
смоделируйте вашу почтовую программу и проверьте, был ли вызван mailer.sendMail(x)