質問
私は読んでいます http://xunitpatterns.com/test%20stub.html また、スタブの使用についていくつか質問があります。たとえば、ページに表示されているコードには、著者が呼ばれるクラスを作成します。 TimeProviderTestStub.java
テストコードで使用するため。この行にはテストコードに疑問があります。
TimeDisplay sut = new TimeDisplay();
// Test Double installation
sut.setTimeProvider(tpStub);
1つのオブジェクトを受信するには、クラス(SUT)を変更する必要がありますか?
解決
スタブクラスと実際のクラスの両方がインターフェイスを実装することになっています。 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
.
実際のクラスのコードを制御しない場合(インターフェイスを実装できないように)、実際のクラスをラップしてインターフェイスを実装するアダプタークラスを作成できます。