Об использовании Stubs - Java - PullRequest
       85

Об использовании Stubs - Java

1 голос
/ 30 апреля 2011

Я читаю http://xunitpatterns.com/Test%20Stub.html и у меня есть несколько вопросов об использовании заглушек, например, в коде, показанном на странице, автор создает класс с именем TimeProviderTestStub.java для использования в тестовом коде. У меня есть некоторые сомнения по поводу этой строки в коде теста:

TimeDisplay sut = new TimeDisplay();
  //      Test Double installation
  sut.setTimeProvider(tpStub);

Нужно ли изменять свой класс (SUT) для получения одного объекта TimeProviderTestSub?

1 Ответ

6 голосов
/ 30 апреля 2011

Предполагается, что и заглушка, и реальный класс реализуют некоторый интерфейс, то есть ITimeProvider, а setTimeProvider() должен принимать этот интерфейс в качестве своего параметра.Интерфейс должен предоставлять все методы, которые SUT необходимо взаимодействовать с объектом, поскольку TimeDisplay теперь может использовать объект только через интерфейс ITimeProvider (что позволяет нам использовать заглушку вместо реального объекта в наших тестах).

В примере SUT (TimeDisplay), похоже, нужен только метод getTime(), поэтому интерфейс должен содержать только этот метод:

public interface ITimeProvider {
    Calendar getTime();
}

Объявление заглушкидолжно быть

public class TimeProviderTestStub implements ITimeProvider { ... }

и объявление реального класса должно быть

public class TimeProvider implements ITimeProvider { ... }

Наконец, SUT должна изменить свой метод установки для принятия интерфейса:

public void setTimeProvider(ITimeProvider timeProvider) { ... }

, а также измените его внутреннее поле timeProvider на тип ITimeProvider.

Если вы не управляете кодом реального класса (так что вы не можете заставить его реализовать интерфейс), выможет создать класс адаптера, который оборачивает реальный класс и реализует интерфейс.

...