#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:
Комментарии:
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 хорошо работает для этого. Я отредактировал свой ответ.