Dagger2 + Mockito:如何对这个场景进行单元测试?

时间:2016-10-27 13:50:18

标签: java android unit-testing mockito dagger-2

我正在开发一个具有非常耦合代码的团队项目。我正在尝试增加单元测试覆盖率,我遇到了以下情况:

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模型,因此,我不知道改变它的构造函数并影响许多其他类是否是一个好主意。关于如何处理这种情况的任何提示?

1 个答案:

答案 0 :(得分:1)

这是错误的设计。

每当您有权访问构造函数时,将类依赖项传递给构造函数。这确实简化了单元测试。类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取决于需要Application的{​​{1}}对象,您无法在单元测试中模拟。将您的测试写为Context,创建适当的androidTest,从中获取Activity对象并进行测试。

相关问题