О использовании заглушек - java
Вопрос
Я читал 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
.
Если вы не управляете кодом реального класса (так что вы не можете заставить его реализовать интерфейс), вы можете создать класс адаптера, который завершает реальный класс и реализует интерфейс.