私はこのようなクラスを持っています:
Class A
{
public boolean do(String s)
{
C c = DB.GetResult(s);
....
return yes/no
}
}
Mockitoでユニットテストを書きたいのですが、内部オブジェクトCをモックしてデータベース接続操作を抑制するにはどうすればよいですか。
私はこのようなクラスを持っています:
Class A
{
public boolean do(String s)
{
C c = DB.GetResult(s);
....
return yes/no
}
}
Mockitoでユニットテストを書きたいのですが、内部オブジェクトCをモックしてデータベース接続操作を抑制するにはどうすればよいですか。
Cではなく内部オブジェクトDBをモックするつもりですか?
あなたが持っているようなコードではできません。DB をクラス A に注入する必要があります。次に、単体テストで、データベースと対話するオブジェクトの代わりにモック/スタブを注入します。
編集:これを行うことができます(私はC#を使用しています):
Class A
{
private readonly IDb database;
// you can inject by hand or using IoC container
// if you don't like that you have to pass IDb implementation everywhere
// where you create objects of type A you can add another constructor - look under
public A(IDb database)
{
this.database = database;
}
// here you call the above constructor and pass you original DB object
public A() : this(new DB())
{
}
public boolean do(String s)
{
C c = database.GetResult(s);
....
return yes/no
}
}
もちろん、DB クラスは IDb インターフェイスを実装する必要があります。
interface IDb
{
C GetResults(String s);
}
今、あなたのテストでこれを行います:
var a = new A(new TestDBDoingReturningExactlyWhatYouTellItToReturn());
およびアプリケーション コードでは:
var a = new A(new DB());
または上記の行を正確に実行するパラメーターなしのコンストラクター
var a = new A();