1

http://xunitpatterns.com/Test%20Stub.htmlを読んでいて、スタブの使用についていくつか質問があります。たとえば、ページに表示されているコードでは、作成者はTimeProviderTestStub.javaテスト コードで使用するために呼び出されるクラスを作成します。テストコードの次の行について疑問があります。

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

1 つのオブジェクト TimeProviderTestSub を受け取るには、クラス (SUT) を変更する必要がありますか?

4

1 に答える 1

6

スタブと実際のクラスの両方が何らかのインターフェイスを実装することになっています。つまりITimeProvidersetTimeProvider()このインターフェイスをパラメータとして使用する必要があります。インターフェイスは、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ます。

実クラスのコードを制御しない場合(インターフェースを実装できないようにするため)、実クラスをラップしてインターフェースを実装するアダプタークラスを作成できます。

于 2011-04-30T15:35:15.160 に答える