2

为了便于清理测试,我想在开发Android应用程序时使用Inversion of Control。对于普通的Java对象来说,看起来很简单,但是当我想用模拟数据对我的ActivityService进行播种时,事情开始出现问题,因为我无法将这些组件的依赖项传递给它们的构造函数。我可以在Android组件中使用Inversion of Control吗?例如Activities和Services?

举个例子,假设我想有我Activity正常使用过程中使用真实HttpUrlConnection,但是出于测试,我想把它使用一个模拟HttpUrlConnection实际上并没有连接到互联网。有没有办法通过IoC完成Activity

我意识到有依赖注入选项,如工厂,和图书馆,如匕首,可以帮助我,但我很好奇,如果有其他方式来实现这一点。

+1

我意识到有可能是你想存根其他的事情,但是对于'HttpUrlConnection'你可以使用MockWebSever和饲料您的应用程序本地URL。另一种选择是将HTTP层抽象为一个可以提供虚假实现的对象。 – 2013-05-08 16:32:58

回答

1

由于构造函数注入的服务或活动在Android中不可行,因为这些类是由Android运行时通过无参数构造函数实例化的,所以您需要某种工厂为您创建外部对象。为了解决这个问题我想创建一个工厂接口,可以有一个模拟实现这样的:

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 ... 
} 
} 
相关问题