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