オンライン機能を必要とするプライベート関数を持つクラスの関数を単体テストする場合。どうやってそれをテストしますか?
例えば:
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%カバーするにはどうすればよいですか?
new CloudService()
そして、あなたの問題があります。
モダンOO設計では、この種の依存関係を直接構築するのではなく 渡される にすることをお勧めします。これは、関数自体または構築時にクラスに渡すことができます。また、そのような複雑さが必要な場合は、Inversion of Controlコンテナーによって取得または集約することもできます。
その時点で、モック/フェイクサービスを渡して、テスト中に「オンライン」データを提供することはかなり簡単になります。さらに良いことに、ソフトウェアが十分に柔軟になるため、一部の(政府の)クライアントがやって来て、その価値のためにクラウドを使用したくない場合でも、迅速に適応できます。または、あるクラウドプロバイダーを別のクラウドプロバイダーにダンプしたい場合。または...
私はそれを次のように実装します:
_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
またはCloudService
isのすべての呼び出しに必須である場合、ICloudService
および適切な呼び出しを行います。