Поэтому меня попросили прочитать о насмешках и BDD для нашей команды разработчиков и поиграть с имитаторами, чтобы улучшить несколько наших существующих модульных тестов (в качестве эксперимента).
У меня есть в конечном итогеЯ решил использовать Mockito по ряду причин (некоторые из них выходят за рамки моего контроля), но именно потому, что он поддерживает как заглушки, так и насмешки в тех случаях, когда насмешка не подходит.
Я потратил весь день на изучениепро Мокито, издевательство (в общем) и БДД.И теперь я готов приступить к расширению наших модульных тестов.
Итак, у нас есть класс с именем WebAdaptor
, который имеет метод run()
:
public class WebAdaptor {
private Subscriber subscriber;
public void run() {
subscriber = new Subscriber();
subscriber.init();
}
}
Обратите внимание: У меня нет способа изменить этот код (по причинам, выходящим за рамки этого вопроса!).Таким образом, я не могу добавить метод установки для Subscriber
, и поэтому его можно рассматривать как недоступный «черный ящик» внутри моего WebAdaptor
.
IЯ хочу написать модульный тест, который включает в себя Mockito
макет и использует этот макет для verify
, при выполнении которого WebAdaptor::run()
вызывает Subscriber::init()
.
Итак, вот что я получил до сих пор(внутри WebAdaptorUnitTest
):
@Test
public void runShouldInvokeSubscriberInit() {
// Given
Subscriber mockSubscriber = mock(Subscriber.class);
WebAdaptor adaptor = new WebAdaptor();
// When
adaptor.run();
// Then
verify(mockSubscriber).init();
}
Когда я запускаю этот тест, выполняется настоящий метод Subscriber::init()
(я могу сказать из вывода консоли и увидеть, как файлы генерируются в моей локальной системе), не mockSubscriber
, который не должен ничего делать (или возвращать).
Я проверил и перепроверил: init
равен public
, не является static
илиfinal
, и возвращается void
.Согласно документам, у Мокито не должно быть проблем с издевательством над этим объектом.
Так что это заставило меня задуматься: нужно ли явно связывать mockSubscriber
с adaptor
?Если это так, то обычно это исправляет следующее:
adaptor.setSubscriber(mockSubscriber);
Но так как я не могу добавить такой установщик (пожалуйста, прочитайте мою заметку выше), я не знаю, какЯ мог бы заставить такую ассоциацию.Итак, несколько очень тесно связанных вопросов:
- Кто-нибудь может подтвердить, что я правильно настроил тест (используя Mockito API)?
- Есть ли у меня подозрение о пропаже?сеттер правильный?(Нужно ли связывать эти объекты с помощью установщика?)
- Если мои подозрения верны, и я не могу изменить
WebAdaptor
, есть ли какие-либо обходные пути в моем распоряжении?
Заранее спасибо!