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() class. Bar 应该是在整个项目中广泛使用的 POJO 模型,因此,我不知道更改其构造函数并影响许多其他 class 是否是个好主意。关于我应该如何处理这种情况的任何提示?

这是错误的设计。

每当您有权访问构造函数时,将 class 依赖项传递给构造函数。这确实简化了单元测试。 Class Bar 应该看起来:

class Bar() {

    @Inject DBAcessor mDBAcessor;

    Bar (DBAcessor dbAcessor) {
        this.mDBAcessor = dbAcessor;
    }

    public Object getContent() {
        mDBAcessor.fetchData();
    }
}

Dagger2Component 中声明的方法只能在您无权访问构造函数(ActivityFragment)的对象内部使用。

那么没有什么能阻止你这样做:

DBAccessor dbAccessor = Mockito.mock(DBAccessor.class);
Bar bar = new Bar(dbAccessor);
bar.getContent();
verify(bar, times(1)).fetchData();

如果你真的需要坚持这样的设计,那么你不能对这样的对象进行单元测试,因为Dagger2依赖于Application对象,它需要Context,你不能在单元测试中模拟。将测试编写为 androidTest,创建适当的 Activity,从中获取 Bar 对象并测试它。