AndroidManifest在androidTest目录中被忽略

时间:2014-10-07 20:46:51

标签: android unit-testing junit

我正在尝试使用以下目录结构(由Android Studio设置)进行测试:

test directory structure

我可以很好地运行一些测试,甚至AllTests.java也可以在没有AndroidManifest.xml文件的情况下正常运行。问题是,对于我的一项新测试,我需要android.permission.INTERNET权限。因此,我将以下内容添加到位于AndroidManifest.xml目录中的androidTest文件中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.core"
          android:versionCode="2"
          android:versionName="2.0" >

    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

不幸的是,这不起作用。当我运行我的一个测试时,我仍然收到以下错误:

  

E / RestAPIRequestTest:权限被拒绝(缺少INTERNET权限?)

我已尝试在我的package文件中将com.example.core.test设置为AndroidManifest.xml(因为这是我在我的设置 - >应用列表中显示的内容),但是没有快乐。

我认为它甚至不能识别AndroidManifest.xml文件,因为版本号也没有显示在测试应用的设置中。

如何为我的测试项目注入正确的权限?

6 个答案:

答案 0 :(得分:23)

我需要做类似的事情。我在androidTest旁边创建了一个名为“debug”的文件夹,它对应于应用程序的调试变体,并在该文件夹中放置了具有权限的AndroidManifest.xml。然后,由于测试应用程序使用调试变体,因此权限正在测试中。它并不理想,因为它模糊了测试和调试之间的界限,这并不完全相同。

我认为正在发生的事情是androidTest / AndroidManifest.xml中的权限将转到测试应用程序,而不是目标应用程序,尽管如果实际上有两个不同的APK或者什么,它不是100%清楚。

答案 1 :(得分:13)

在旧版Android Studio和Android Gradle插件中,androidTest / AndroidManifest.xml文件被忽略。这在当时的tools.android.com网站上有记录。

随着Android Studio 1.0+和Android Gradle 1.0+插件于2014年12月推出,AndroidManifest.xml文件现在应该与普通的main / AndroidManifest.xml文件合并(除了调试和发布清单文件(如果存在) )。关于清单合并的更多细节rules are here

如果您仍遇到问题或只是调试清单相关的测试问题,请尝试此操作 (稍微适应Windows):

  1. 放到终端
  2. 切换到您的项目目录 cd MyApplication
  3. 构建您的项目,假设&#39; debug&#39;是您要测试的构建类型,但您也可以使用&#39; release&#39;进行测试。或者构建脚本定义一个。 ./gradlew assembleDebugTest
  4. 然后检查您的测试APK清单: ls app/build/intermediates/manifests/test/debug/AndroidManifest.xml
  5. 查看您的应用程序APK清单: ls app/build/intermediates/manifests/full/debug/AndroidManifest.xml
  6. 可以找到合并输出日志,详细说明清单合并过程: ls app/build/outputs/apk/manifest-merger-debug-report.txt
  7. 一些额外的说明:

    • 检测元素会自动添加到您的测试APK的AndroidManifest.xml中,因此您只应添加测试APK所需的额外活动,权限等。
    • 如果使用模拟位置进行测试,您的应用APK将需要ACCESS_MOCK_LOCATION权限。您可以将权限添加到debug / AndroidManifest.xml文件中,也可以定义测试APK和应用程序APK在部署时应使用相同的userId(AndroidManifest.xml中的sharedUserId属性)。

答案 2 :(得分:3)

如指定here,在检测测试期间,会生成两个.apk文件。如果您看一下,较小的那个最可能是名为app-debug-androidTest-unaligned.apk的那个,而实际上确实包含所提供的权限。

使用aapt d permissions <apk_file_path>.apk检查文件对于查看所有文件的列表非常有用。

现在,请求权限的上下文本身可能存在问题。我遇到了类似的问题,试图在SD卡上写一些截图(因此需要WRITE_EXTERNAL_STORAGE权限)。

answer帮助我解决了这个问题,虽然我无法完全理解为什么这是必要的。

简而言之,您需要在两个清单中声明相同的android:sharedUserId,以便在两个apks安装在同一设备上时合并权限 - 这在测试运行时发生。 这有助于我将仅用于测试的权限与生产中的权限分开。

答案 3 :(得分:0)

一个解决方案就像在单次运行中构建主apk和测试apk。 示例:./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest

这将创建一个新的检测主应用程序,它具有测试应用程序所需的所有额外权限。

答案 4 :(得分:0)

  

这是一个已知问题。

当前(AGP <= 3.4.X)不支持AndroidManifest测试合并。

在这里报告:https://issuetracker.google.com/issues/127986458here则是其中一个Roboelectric维修人员制造的问题。

here中描述的变通办法与 user3286293 所提出的变通方案几乎相同,目前是合并清单以进行测试的唯一方法。

希望看到针对AGP 3.5或3.6的修复程序

答案 5 :(得分:0)

您需要在build.gradle文件中定义它:

android {
    sourceSets {
        androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
    }
}