我正在开发一个具有非常耦合代码的团队项目。我正在尝试增加单元测试覆盖率,我遇到了以下情况:
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模型,因此,我不知道改变它的构造函数并影响许多其他类是否是一个好主意。关于如何处理这种情况的任何提示?
答案 0 :(得分:1)
这是错误的设计。
每当您有权访问构造函数时,将类依赖项传递给构造函数。这确实简化了单元测试。类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
取决于需要Application
的{{1}}对象,您无法在单元测试中模拟。将您的测试写为Context
,创建适当的androidTest
,从中获取Activity
对象并进行测试。