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();
}
}
Dagger2
在 Component
中声明的方法只能在您无权访问构造函数(Activity
或 Fragment
)的对象内部使用。
那么没有什么能阻止你这样做:
DBAccessor dbAccessor = Mockito.mock(DBAccessor.class);
Bar bar = new Bar(dbAccessor);
bar.getContent();
verify(bar, times(1)).fetchData();
如果你真的需要坚持这样的设计,那么你不能对这样的对象进行单元测试,因为Dagger2
依赖于Application
对象,它需要Context
,你不能在单元测试中模拟。将测试编写为 androidTest
,创建适当的 Activity
,从中获取 Bar
对象并测试它。
我正在处理一个代码非常耦合的团队项目。我正在尝试增加单元测试覆盖率,但遇到了以下情况:
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();
}
}
Dagger2
在 Component
中声明的方法只能在您无权访问构造函数(Activity
或 Fragment
)的对象内部使用。
那么没有什么能阻止你这样做:
DBAccessor dbAccessor = Mockito.mock(DBAccessor.class);
Bar bar = new Bar(dbAccessor);
bar.getContent();
verify(bar, times(1)).fetchData();
如果你真的需要坚持这样的设计,那么你不能对这样的对象进行单元测试,因为Dagger2
依赖于Application
对象,它需要Context
,你不能在单元测试中模拟。将测试编写为 androidTest
,创建适当的 Activity
,从中获取 Bar
对象并测试它。