Как мне протестировать метод void, который просто создает клиента и отправляет сообщение?

#java #unit-testing #junit #mockito #azureservicebus

#java #модульное тестирование #junit #mockito #azureservicebus

Вопрос:

Я новичок в тестировании, и у меня есть метод, который я не знаю, как протестировать с помощью mockito. Я тестировал методы, которые имеют обратные вызовы в прошлом, но это первый раз, когда я пытался написать тест для этого. Я даже не уверен, что мне нужно протестировать в приведенном ниже методе, кроме как убедиться, что вызывается метод отправки.

     private void sendMsg(Message msg, String connectionString, String qName) throws InterruptedException, ServiceBusException {

        QueueClient client= new QueueClient(new ConnectionStringBuilder(connectionString, qName),
                ReceiveMode.PEEKLOCK);
        client.send(msg);
        client.close();
    }
  

Ответ №1:

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

Для функции отправки сообщения вы можете проверить, что она вызывается, что она не создает никаких исключений, и если это сообщение электронной почты, вы также можете написать функцию, которая подключается к адресу электронной почты и проверяет получение сообщения.

Есть много вещей, которые вы можете протестировать, но постарайтесь определить, какие из них являются ценными для вашего проекта.

Ответ №2:

Поскольку вы используете Mockito, вы можете использовать Mockito verify: https://site.mockito.org/javadoc/current/org/mockito/Mockito.html#4

Здесь есть отличная статья: https://www.baeldung.com/mockito-verify

Вероятно, вам потребуется имитировать поведение других объектов, но это общая идея для проверки того, что send был вызван один раз в Mockito:

 @Mock
QueueClient client;
@Mock
Message msg;

@Test
public void testClienSendWasCalledOnce() {
    String connectionString;
    String qName;
    sendMsg(msg, connectionString, qName);

    verify(client, times(1)).send(msg);
}
  

Если вы тестируете конечный или статический метод, будут работать PowerMock или EasyMock. Здесь есть отличная статья для PowerMock:

https://www.baeldung.com/intro-to-powermock

Комментарии:

1. зачем мне нужно вызывать client.send(msg)? если я вызываю sendMsg в строке выше, который в любом случае вызовет client.send .

2. Также это относится к функциональному приложению Azure, поэтому я получаю эту ошибку. «org.mockito.exceptions.base. Исключение MockitoException: не удается создать класс mock / spy com.microsoft.azure.servicebus. QueueClient Mockito не может издеваться / шпионить, потому что: — конечный класс»

3. Вам не нужно вызывать client.send(сообщение об ошибке). Я скопировал ваш код в редактор и, чтобы смоделировать свой ответ, и случайно оставил эту строку.

4. Да, Mockito не может имитировать конечные классы. PowerMock хорошо работает для этого. Я отредактировал свой ответ.