为了便于清洁测试,我想在开发Android应用程序时使用Inversion of Control。使用普通的Java对象看起来很简单,但是当我想用模拟数据为我的Activity
和Service
s种子时,事情开始变得有问题,因为我没有能力传递那些组件对其构造函数的依赖性。
例如,假设我想让我的Activity
在正常使用期间使用真正的HttpUrlConnection
,但是为了进行测试,我希望让它使用不是HttpUrlConnection
的模拟Activity
实际上连接到互联网。有没有办法通过IoC实现{{1}}?
我意识到存在依赖注入选项,例如工厂,以及像Dagger这样的库可以帮助我,但我很好奇是否有其他方法可以实现这一点。
答案 0 :(得分:1)
由于Android中无法使用Constructor-Injection for Service或Activity,因为这些类是由Android运行时使用无参数构造函数实例化的,因此您需要某种 factory 来为您创建外部对象。为了解决这个问题,我将创建一个Factory-Interface,它可以有一个这样的模拟实现:
public class MyService : Service {
public static IFactory myFactory = new MyFactory();
// the non-mocked version used as Default
void myLocalFunction() {
...
HttpUrlConnection connection = myFactory.createHttpUrlConnection();
...
}
}
public MyServiceTest : ... {
class MyMockedFactory : MyFactory {
HttpUrlConnection createHttpUrlConnection(){return new MockedHttpUrlConnection();}
}
public myTest() {
MyService.myFactory = new MyMockedFactory();
.... do the test ...
}
}