2

TLDR注入依赖:我正在开发运行多个进程中的应用程序。出于UI测试的目的,我想注入一个虚假的API依赖关系,使应用程序在独立于网络交互的测试下运行,但是,这似乎不适用于多进程设置。在多进程的Android应用程序

我使用this post描述的方法,让我实现了自定义AndroidJUnitRunner它实例用模拟物的依赖关系的应用程序(让它成为MockApplication),而不是一个与真正的依赖(让它成为RealApplication)。它确实工作,我的应用程序从主进程查询虚拟API接口。

我的应用程序,但是,使用多个过程,例如有一个数据处理Service,它在其自己的进程中运行,并且只从应用程序代码的startService调用开始。出于某种原因,此过程以RealApplication的实例运行,没有任何模拟依赖关系。

有什么办法,我可以使它发挥作用?我试着挖掘负责应用程序实例化的Android代码,但还没有发现任何特别有用的东西。

P.S.我使用Dagger 2作为DI,但这可能不是真正相关的。

回答

1

的问题是,您的自定义应用程序类不会覆盖在AndroidManifest.xml真实的。

你只是告诉仪器测试运行器来运行你的自定义应用程序类,但这时如果应用程序启动另一个进程,Android框架甚至不知道它运行所需要的,而不是真正的自定义应用程序类。

所以,我建议你connectedAndroid任务执行期间重写应用程序类的定制之一AndroidManifest.xml,为您的应用程序将使用自定义类,即使没有黑客测试运行,每当新进程启动的结果。

0

我在这个问题上挣扎过,因为我需要模拟发射,从开始在其自己的进程的Service网络调用。

要在您的测试中使用你的应用程序的每一个过程的自定义应用程序对象(MockApplication),一个解决方案是用的manifestPlaceholders的帮助下注入构建变量在AndroidManifest.xml

我定义中的build.gradle两条产品口味:

productFlavors { 
    mock { 
     manifestPlaceholders = [application:".MockApplication"] 
    } 
    prod { 
     manifestPlaceholders = [application:".RealApplication"] 
    } 

} 
  • PROD:将设置真实应用程序对象(RealApplication)清单中
  • 模拟:将设置模拟应用程序对象(MockApplication)以模拟网络电话

AndroidManifest.xml,使用变量“应用程序”是这样的:

<application 
    android:label="@string/app_name" 
    android:name="${application}"> 

现在,当你想使用MockApplication,只需运行与构建变量“mockDebug”

您的仪器测试
相关问题