我有一个相当复杂的 Android 项目,我想对其进行彻底的测试。
所以我实现了依赖注入(inject),以便能够测试多个组件(为此我使用了 Kodein)。
然后我开始编写测试,我发现我必须使用 PowerMock,例如模拟对 File.create 的调用。
PowerMock 还可以模拟构造函数、工厂方法等。所以基本上对于测试,我可以获得与依赖注入(inject)相同的结果,但无需修改代码。
所以我的问题是:
如果我可以用 PowerMock 模拟任何东西,还有实现依赖注入(inject)的理由吗?
在某些情况下,您会在其中一种情况下使用,有时会同时使用两种情况。这完全取决于您要测试什么。 Power Mock 让您更好地控制可以测试或不能测试的内容。而 DI 给你更直接的结果。
这里有一些例子:
假设您有匿名类(class)。
@Override
public Query getQuery() {
Query q = Query.empty();
if (wp.minSpeed < 0)
q = Query.and(q, Query.eq(Speed.Function, WayPoint));
else {
q = Query.and(q, Query.eq(Speed.Function, Field));
q = Query.and(q, Query.eq(Speed.Calc, wp.maxSpeed-wp.minSpeed));
}
q = Query.and(q, Query.eq(Speed.Id, wp.altitude/greatCircle));
return q;
}
因为没有办法测试匿名类来实现 100% 的覆盖率。您应该知道 power mockito 是唯一的方法。你只能模仿那个类的行为。
但是,如果您有一些具有多个类调用的乏味类,您可能需要考虑使用依赖注入(inject)来减少 spy /模拟的数量。