Тестирование методов void, которые ничего не меняют в тестовом сценарии

Я знаю, что каждый метод, который ничего не делает, не должен тестироваться (или даже не существовать). Дело в том, что мой метод кое-что делает нормально, но для тестового сценария мне приходится издеваться над тем, что он делает. Но я все же хотел бы утверждать параметры, которые он будет отправлять во внешнюю вещь.

Звучит сложнее, чем есть на самом деле. Проверьте мой фрагмент для лучшего понимания:

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? А если нет, что было бы лучшим решением, не испортив мой класс только для тестирования?

смоделируйте вашу почтовую программу и проверьте, был ли вызван mailer.sendMail(x)

Stultuske 28.05.2019 12:50

@Stultuske Моя почтовая программа издевается, и мне нужно значение parameter для проверки. Не только если его назвали

MauriceNino 28.05.2019 12:51

поэтому проверьте, вызывается ли он с этим параметром.

Stultuske 28.05.2019 12:55

Вот что я пытаюсь выяснить. На SO ничего подобного не нашел. @Stultuske

MauriceNino 28.05.2019 12:58
stackoverflow.com/questions/9841623/…
Stultuske 28.05.2019 13:03

Это не тот сценарий @Stultuske.

MauriceNino 28.05.2019 13:05

да это так. это просто уровень глубже. Теперь вы можете сказать, что это не тот же сценарий, но тогда зачем вам принимать ответ, который говорит вам точно то же самое?

Stultuske 28.05.2019 13:12

Мой вопрос был: «Как я могу получить доступ к результату пустоты, которая отправляется в издевательскую вещь». Он ответил на это. Этот другой пост StackOverflow этого не делает. Он просто говорит мне, как проверить, что он был вызван (для чего у меня были бы и другие способы) @Stultuske

MauriceNino 28.05.2019 13:15

Пустота не имеет возвращаемого значения, это правильно, но она может привести к чему-то (в этом примере это приводит к отправленному электронному письму). Ссылка, которую вы разместили, не решила мою проблему. Тем не менее, спасибо за вашу помощь и беспокойство.

MauriceNino 28.05.2019 13:37

вы не можете проверить это, вы можете только проверить, что метод был вызван и не было выдано никаких исключений. Принятый вами ответ не проверяет больше, чем это: просто вызывается метод и то, что вы передали в качестве параметра.

Stultuske 28.05.2019 13:39
parameter == the result просто чтобы уточнить это для вас...
MauriceNino 28.05.2019 13:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
188
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно использовать 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", но игнорировать дату? Я обновил свой вопрос примером.

MauriceNino 28.05.2019 13:03

Это отвечает на мой вопрос. Спасибо! Я отмечу это как принятое, но один маленький вопрос: вы можете сделать что-то вроде eqContains("te")?

MauriceNino 28.05.2019 13:09

неважно, я нашел это довольно быстро теперь, когда я знаю об этом. это просто Matchers.contains().

MauriceNino 28.05.2019 13:22

Вы также можете посмотреть на ArgumentCaptor. Допустим, ваш параметр был сложным объектом с множеством полей, а не простой строкой. Вы можете использовать ArgumentCaptor, чтобы захватить объект, который был передан вашему макету, и затем проверить его. Это гораздо мощнее, но для таких простых проверок, как эта, слишком много.

David Lavender 28.05.2019 13:25

Спасибо за подсказку!

MauriceNino 28.05.2019 13:34

Один из способов — параметризовать метод doSomething с помощью изменяемый объект, который вы можете установить при выполнении метода и подтвердить в тестовом методе. В противном случае вы также можете проверить наличие исключений для любого негативного сценария, например

@Test(expected = EmailSendException.class)
public void testDoSomething(){
    ....
}

это ужасный план. что, если что-то еще вызовет такое исключение? понимаете, они пытаются проверить счастливый поток, а не исключение

Stultuske 28.05.2019 13:04

Электронная почта издевается, поэтому ничего не выбрасывает. Я мог бы что-то кинуть вручную, но это все равно не позволяло бы мне проверить результат parameter.

MauriceNino 28.05.2019 13:13

Другие вопросы по теме