0
我有一類這樣的:如何在做單元測試時模擬內部對象?
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到抑制數據庫連接操作。
你的意思是模擬內部對象DB不是C的權利?
像你這樣的代碼你不能。您必須將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();
的Mockito不支持類的靜態方法。我如何注入數據庫和方法? – brucenan 2013-03-04 05:59:30
爲了模擬它,DB.GetResult不能是靜態的。你真的需要它是靜態的嗎?沒有太多的理由讓方法變爲靜態的。 – 2013-03-04 10:01:33
我可以將其更改爲非靜態。但是一個數據庫類出現內部方法.DB db = new DB(); C c = db.get();同樣的問題即將到來。我怎樣才能模擬數據庫對象? – brucenan 2013-03-04 11:45:35