在我的分析器报告中,我越来越多地看到使用依赖注入进行基于模拟的测试的结果。许多依赖项是静态的,但是因为我们想单独测试方法,所以它们被更改为实例成员,如下例所示:
class ShortLivedThing {
IDependency1 dep1;
IDependency1 dep2;
IDependency1 dep3;
...
int TheRealData;
// Constructor used in production
public ShortLivedThing() {
dep1 = new Dep1(); dep2 = new Dep2(); dep3 = new Dep3();
}
// DI for testing
public ShortLivedThing(IDependency1 d1, IDependency2 d2, IDependency3 d3) {
dep1 = d1(); dep2 = d2(); dep3 = d3();
}
}
反过来,大多数时候依赖项还有其他依赖项等等。这导致每次在测试之外进行方法调用时都会实例化(主要是“静态”)对象树。每个对象都非常小(只有几个指针),但树效应将其转化为不断增加的性能影响。
我们对于它可以做些什么呢?