Mockito: имитация зависимостей «черного ящика»

Итак, меня попросили почитать о мокинге и 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);

Но поскольку я не могу добавить такой установщик (пожалуйста, прочтите мое примечание выше), я не понимаю, как я могу заставить такую ​​ассоциацию . Итак, несколько очень тесно связанных вопросов:

  • Может ли кто-нибудь подтвердить, что я правильно настроил тест (используя Mockito API)?
  • Верны ли мои подозрения по поводу отсутствия сеттера? (Нужно ли мне связывать эти объекты через сеттер?)
  • Если мои вышеупомянутые подозрения верны, и я не могу изменить WebAdaptor , могу ли я обойтись без обходных путей?

Спасибо за продвигать!

11
задан IAmYourFaja 22 December 2011 в 19:30
поделиться