在多进程Android应用程序中注入依赖项

在多进程Android应用程序中注入依赖项,android,functional-testing,android-espresso,multiple-processes,Android,Functional Testing,Android Espresso,Multiple Processes,TLDR:我正在开发一个在多个进程中运行的应用程序。出于UI测试的目的,我想注入一个伪API依赖项,使应用程序在测试下运行,独立于网络交互,但是,这在多进程设置中似乎不起作用 我正在使用中描述的方法,因此我实现了一个定制的AndroidJUnitRunner,它实例化了具有模拟依赖项的应用程序(让它成为MockApplication),而不是具有真实依赖项的应用程序(让它成为RealApplication)。它确实可以工作,我的应用程序从主进程查询假API接口 但是,我的应用程序使用多个进程,例

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

我正在使用中描述的方法,因此我实现了一个定制的
AndroidJUnitRunner
,它实例化了具有模拟依赖项的应用程序(让它成为
MockApplication
),而不是具有真实依赖项的应用程序(让它成为
RealApplication
)。它确实可以工作,我的应用程序从主进程查询假API接口

但是,我的应用程序使用多个进程,例如,有一个数据处理
服务
,它在自己的进程中运行,并且只在从应用程序代码调用
startService
时启动。出于某种原因,此流程使用
RealApplication
实例运行,没有任何模拟依赖项

我有办法让它工作吗?我试图深入研究负责应用程序实例化的Android代码,但还没有发现任何特别有用的东西


另外,我将Dagger 2用于DI,但这可能并不真正相关。

问题在于,您的自定义应用程序类没有覆盖
AndroidManifest.xml中的真实类

您只是告诉instrumentation test runner运行您的自定义应用程序类,但如果应用程序启动另一个进程,Android框架甚至不知道它需要运行您的自定义应用程序类而不是真正的应用程序类


因此,我建议您在执行
connectedAndroid
任务期间,将应用程序类重写为
AndroidManifest.xml
中的自定义类,因此,您的应用程序将使用自定义类,即使不攻击测试运行程序,也可以在新进程启动时使用。

我也在努力解决这个问题,因为我需要模拟在自己进程中启动的
服务发出的网络呼叫

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

我在build.gradle中定义了两种产品风格:

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

}
  • prod:将在清单中设置真实的应用程序对象(RealApplication)
  • mock:将mock应用程序对象(MockApplication)设置为mock网络调用
AndroidManifest.xml
中,使用如下变量“application”:

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


现在,当您想使用MockApplication时,只需使用构建变量“mockDebug”运行您的插装测试即可。

Hi,有没有示例说明如何做到这一点?您最终是如何解决的?