web-dev-qa-db-ja.com

オンライン機能を備えたユニットテストクラス

オンライン機能を必要とするプライベート関数を持つクラスの関数を単体テストする場合。どうやってそれをテストしますか?

例えば:

public class Foo
{
    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        CloudService c = new CloudService();
        int oval = c.getValueFromService();
        return oval;
    }
}

関数「methodA()」をテストすると、「goOnlineToGetVal()」を使用しようとしますが、このテストが機能なしで行われた場合は、オンラインになります。オンラインに行かずにクラスを100%カバーするにはどうすればよいですか?

23

new CloudService()

そして、あなたの問題があります。

モダンOO設計では、この種の依存関係を直接構築するのではなく 渡される にすることをお勧めします。これは、関数自体または構築時にクラスに渡すことができます。また、そのような複雑さが必要な場合は、Inversion of Controlコンテナーによって取得または集約することもできます。

その時点で、モック/フェイクサービスを渡して、テスト中に「オンライン」データを提供することはかなり簡単になります。さらに良いことに、ソフトウェアが十分に柔軟になるため、一部の(政府の)クライアントがやって来て、その価値のためにクラウドを使用したくない場合でも、迅速に適応できます。または、あるクラウドプロバイダーを別のクラウドプロバイダーにダンプしたい場合。または...

76
Telastyn

私はそれを次のように実装します:

_public class Foo
{
    private ICloudService cloudService;

    public Foo(ICloudService s)
    {
       cloudService=s;
    }

    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        int oval = cloudService.getValueFromService();
        return oval;
    }
}
_

インターフェースICloudServiceは、テスト用のモックまたは「実際の」クラウドサービスのいずれかで実装できます。インスタンス化new CloudService()が、変更できないサードパーティAPIからのgetValueFromServiceまたはCloudServiceisのすべての呼び出しに必須である場合、ICloudServiceおよび適切な呼び出しを行います。

37
Doc Brown