スタブと実際のクラスの両方が何らかのインターフェイスを実装することになっています。つまり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
ます。
実クラスのコードを制御しない場合(インターフェースを実装できないようにするため)、実クラスをラップしてインターフェースを実装するアダプタークラスを作成できます。