4

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

我正在使用这篇文章中描述的方法,所以我实现了一个自定义AndroidJUnitRunner实例,它使用模拟依赖项(让它成为MockApplication)而不是具有真正依赖关系的应用程序(让它成为)实例化应用程序RealApplication。它确实有效,我的应用程序从主进程查询假 API 接口。

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

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

PS 我正在使用 Dagger 2 进行 DI,但这可能并不真正相关。

4

2 回答 2

2

问题是您的自定义应用程序类没有覆盖AndroidManifest.xml.

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

因此,我建议您在任务执行AndroidManifest.xml期间将应用程序类覆盖为自定义类,因此即使没有破解测试运行器以及每当新进程启动时,您的应用程序也将使用自定义类。connectedAndroid

于 2016-02-18T16:21:07.647 回答
1

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

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

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

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

}
  • prod :将在清单中设置真实的应用程序对象(RealApplication)
  • mock :将模拟应用程序对象(MockApplication)设置为模拟网络调用

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

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

现在,当您想使用 MockApplication 时,只需使用构建变体“mockDebug”运行您的仪器测试

于 2017-04-21T14:23:34.770 回答