[英]Dagger2 + Mockito: How to Unit Test this scenario?
我正在一個團隊項目中,它具有非常耦合的代碼。 我正在嘗試增加單元測試的覆蓋范圍,並且遇到了以下情況:
class Foo {
static void methodA () {
Bar b = new Bar();
b.getContent();
}
}
class Bar {
@Inject
DBAcessor mDBAcessor;
Bar () {
Dagger2.getInjector().inject(this);
}
public Object getContent() {
mDBAcessor.fetchData();
}
}
我想對methodA()
進行單元測試,但是我不知道是否有可能在不通過構造函數將DBAcessor
對象傳遞給Bar()
類的情況下進行測試。 Bar
應該是在整個項目中廣泛使用的POJO模型,因此,我不知道更改其構造函數並影響這么多其他類是否是一個好主意。 關於如何應對這種情況的任何提示?
那是錯誤的設計。
只要有訪問構造函數的權限,就將類依賴關系傳遞給構造函數。 這確實簡化了單元測試。 類Bar
應如下所示:
class Bar() {
@Inject DBAcessor mDBAcessor;
Bar (DBAcessor dbAcessor) {
this.mDBAcessor = dbAcessor;
}
public Object getContent() {
mDBAcessor.fetchData();
}
}
在Component
聲明的Dagger2
方法僅應在無法訪問構造函數( Activity
或Fragment
)的對象內使用。
然后,沒有什么可以阻止您這樣做:
DBAccessor dbAccessor = Mockito.mock(DBAccessor.class);
Bar bar = new Bar(dbAccessor);
bar.getContent();
verify(bar, times(1)).fetchData();
如果您確實需要堅持這樣的設計,那么您就不能對此類對象進行單元測試,因為Dagger2
依賴於需要Context
Application
對象,而您不能在單元測試中進行仿真。 將您的測試編寫為androidTest
,創建適當的Activity
,從中獲取Bar
對象並進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.