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