我可以将控制反转与Android组件(如活动和服务)一起使用吗?

时间:2013-05-08 08:37:10

标签: java android dependency-injection inversion-of-control dagger

为了便于清洁测试,我想在开发Android应用程序时使用Inversion of Control。使用普通的Java对象看起来很简单,但是当我想用模拟数据为我的ActivityService s种子时,事情开始变得有问题,因为我没有能力传递那些组件对其构造函数的依赖性。

例如,假设我想让我的Activity在正常使用期间使用真正的HttpUrlConnection,但是为了进行测试,我希望让它使用不是HttpUrlConnection的模拟Activity实际上连接到互联网。有没有办法通过IoC实现{{1}}?

我意识到存在依赖注入选项,例如工厂,以及像Dagger这样的库可以帮助我,但我很好奇是否有其他方法可以实现这一点。

1 个答案:

答案 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 ...
 }
}