java - 我可以对 Android 组件(例如 Activity 和服务)使用控制反转吗?

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

为了促进更干净的测试,我想在开发 Android 应用程序时使用控制反转。对于普通的 Java 对象来说,看起来很简单,但是当我想用模拟数据播种我的 Activity 和 Service 时,事情开始看起来有问题,因为我不这样做能够将这些组件的依赖项传递给它们的构造函数。

举个例子,假设我想让我的 Activity 在正常使用期间使用真正的 HttpUrlConnection,但为了测试,我想让它使用模拟 >HttpUrlConnection 实际上并未连接到互联网。有没有办法通过 Activity 的 IoC 来完成此任务?

我意识到有依赖注入(inject)选项(例如工厂)和库(例如 Dagger)可以帮助我,但我很好奇是否还有其他方法可以实现此目的。

最佳答案

由于服务或 Activity 的构造函数注入(inject)在 Android 中是不可能的,因为这些类是由 Android 运行时使用无参数构造函数实例化的,因此您需要某种工厂来为您创建外部对象。为了解决这个问题,我将创建一个工厂接口(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 ...
 }
}

关于java - 我可以对 Android 组件(例如 Activity 和服务)使用控制反转吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16436112/

相关文章:

javascript - Angular 单例服务

dependency-injection - 将连接字符串注入(inject) DI 解析的类

java.lang.IllegalStateException : Neither BindingResult nor plain target object for bean name 'subscription' available as request attribute

java - 单击 fragment 按钮时如何获取下一个 Activity

java - 在联合表上使用 Specifications 和 CriteriaQuery 的 Spring JPA

android - android如何在浏览器中处理px vs dp?

Android:尝试导入一个项目并不断获取无法执行 dex:错误

java - 节省天文台时间?

java - jak 看起来不再可用,使用 JAXB 创建 kml

c# - 如何使用简单注入(inject)器在自定义 ClaimsPrincipal 中注入(inject)服务