簡體   English   中英

Dagger2 + Mockito:如何對這種情況進行單元測試?

[英]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方法僅應在無法訪問構造函數( ActivityFragment )的對象內使用。

然后,沒有什么可以阻止您這樣做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM