Вопрос

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

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

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

Это было полезно?

Решение

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

В примере, сут (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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top