5

私には次のようなクラスがあります(Aと呼びましょう)。

  • コンストラクターでは、構成を取得し、それに基づいてWebサービスのスタブを作成し、それへの参照をプライベートフィールドに格納します。
  • Webメソッドを呼び出すメソッドがいくつかあり、その間にいくつかのものがあります。

私は次のような単体テストの作成を開始しました。

  • ダミー構成でクラスAのインスタンスを作成します。
  • リフレクションを通じて、モックされたWebサービススタブを注入します。

そのWebサービスにはたくさんの方法がありますが。

  • それらすべてを(すべてのテストで、異なるデータを使用して)モックする必要がありますか?
  • または、使用されているWebメソッドのみをカプセル化する別のレイヤーを作成する必要がありますか?
  • または別のアプローチがありますか?
4

3 に答える 3

5

Webサービスの周りにラッパーインターフェイスを作成し、テスト対象のクラスがWebサービスに直接依存するのではなく、そのインターフェイスに依存するようにする必要があります。その後、インターフェイスをモックできます。そのインターフェイスに、興味深いと思われるWebサービスのメソッドのみを公開させます。これはファサードパターンと呼ばれ、ここで詳しく説明します。

テストしているものについての手がかりを持たずに、次のようなものを目指してください。

public interface IWebserviceWrapper
{
    Whatever DoStuff(int something);
}

public class WebserviceWrapper : IWebserviceWrapper
{
    private WebService _theActualWebservice;

    public WebserviceWrapper(Webservice theService)
    {
        _theActualWebService = theService;
    }

    public Whatever DoStuff(int something)
    {
         return _theActualWebservice.DoSomething(something);
    }

}

この場合、テストは次のようになります(この場合、MOQを使用)

public void Test_doing_something()
{
    Mock<IWebserviceWrapper> _serviceWrapperMock = new Mock<IWebserviceWrapper>();

    _serviceWrapperMock.SetUp(m => m.DoStuff(12345)).Returns(new Whatever());

    var classUnderTest = new ClassUnderTest(_serviceWrapperMock.Object);

    var result = classUnderTest.Dothings(12345);

    Assert.Whatever....

}
于 2012-11-23T19:58:53.040 に答える
1

短い答えはい:)。長い答えは、たとえばhttp://code.google.com/p/mockito/のようなモックライブラリを使用する必要があります。ユニットテストでは、WSスタブをモックしてテスト済みのクラスに渡します。それが力のやり方です:)

于 2012-11-23T18:40:11.050 に答える
1

クラスを単体テストするときは、常にそのクラスのみをテストし、その依存関係を含めないようにする必要があります。これを行うには、WSをモックして、メソッドが呼び出されたときにダミーデータを返すようにする必要があります。シナリオによっては、各テストのすべてのメソッドをモックする必要はありません。使用されているメソッドのみをモックします。

モックの例については、次の記事を読むことができます:http ://written-in-codes.blogspot.ca/2011/11/unit-tests-part-deux.html

于 2012-11-23T20:52:42.927 に答える