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