Итак, меня попросили почитать о мокинге и BDD для нашей команды разработчиков и поиграться с макетами, чтобы улучшить некоторые из наших существующих модульных тестов (в качестве эксперимента).
В конечном итоге я выбрал Mockito по ряду причин (некоторые из которых выходят за рамки моего контроля), а именно потому, что он поддерживает как заглушки, так и насмешки в тех случаях, когда насмешки не подходят.
Я весь день изучал Mockito, mocking (в целом) и BDD. И теперь я готов копнуть и начать расширять наши модульные тесты.
Итак, у нас есть класс WebAdaptor
, который имеет метод run ()
:
public class WebAdaptor {
private Subscriber subscriber;
public void run() {
subscriber = new Subscriber();
subscriber.init();
}
}
Обратите внимание: У меня нет способа изменить этот код ( по причинам, выходящим за рамки этого вопроса!). Таким образом, у меня нет возможности добавить метод установки для подписчика
, и поэтому его можно рассматривать как недоступный «черный ящик» внутри моего WebAdaptor
.
Я хочу написать модульный тест, который включает макет Mockito
и использует этот макет, чтобы проверить
, что выполнение 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
является общедоступным
, не является ни статическим
, ни окончательным
, и он возвращает ] void
. Согласно документации, у Mockito не должно возникнуть проблем с издевательством над этим объектом.
Это заставило меня задуматься: нужно ли явно связывать mockSubscriber
с адаптером
? Если это так, то обычно это исправляет следующее:
adaptor.setSubscriber(mockSubscriber);
Но поскольку я не могу добавить такой установщик (пожалуйста, прочтите мое примечание выше), я не понимаю, как я могу заставить такую ассоциацию . Итак, несколько очень тесно связанных вопросов:
WebAdaptor
, могу ли я обойтись без обходных путей? Спасибо за продвигать!