Robolectric说"没有找到AndroidManifest.xml"

时间:2015-06-18 10:59:50

标签: android android-studio android-gradle robolectric

在尝试让Robolectric RC3在Android Studio中运行时,我得到了

Caused by: java.lang.RuntimeException: build/intermediates/bundles/debug/AndroidManifest.xml not found or not a file; it should point to your project's AndroidManifest.xml
at org.robolectric.manifest.AndroidManifest.validate(AndroidManifest.java:120)
at org.robolectric.manifest.AndroidManifest.getResourcePath(AndroidManifest.java:469)
at org.robolectric.manifest.AndroidManifest.getIncludedResourcePaths(AndroidManifest.java:475)
at org.robolectric.RobolectricTestRunner.createAppResourceLoader(RobolectricTestRunner.java:479)
at org.robolectric.RobolectricTestRunner.getAppResourceLoader(RobolectricTestRunner.java:471)
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:73)
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:421)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:234)

我试过

@Config(manifest = "app/src/main/AndroidManifest.xml", constants = BuildConfig.class, sdk=21)

我尝试在我的TestRunner中设置清单位置,没有任何效果。在文件系统中,我看到清单在

./app/build/intermediates/manifests/full/debug/AndroidManifest.xml

不在Robolectric寻找它的位置。 有一次,清单被忽略了,然后资源出现了类似的问题,应用程序或Robolectric无法找到我的应用程序使用的原始资源。 这是在我的构建文件中:

   sourceSets {
    main {
        java.srcDirs = ['src/main/java']
        resources.srcDirs = ['src/main/res']
    }
    test {
        java.srcDirs = ['src/test/java', 'src/main/java']
        resources.srcDirs = ['src/test/res', 'src/main/res']
    }
}

如何告诉Robolectric在哪里寻找清单,更重要的是,在哪里寻找资源?

编辑: 我从github检查了Robolectric,我已经构建了它,将它安装在我当地的.m2 repo中,gradle文件现在引用了本地的SNAPSHOT构建,我确保Gradle没有获得新版本来自远程回购。然后我将RobolectricGradleTestRunner复制到我的项目中,我更改了定义文件位置的行:它没有包含模块名称。现在它有效。

9 个答案:

答案 0 :(得分:73)

我假设您正在尝试使用JUnit运行测试。你可以尝试两种不同的东西:

  1. 创建自定义TestRunner类,如图here所示。检查CustomTestRunner部分,您基本上创建一个实际知道要使用的正确清单的TestRunner。使用@Config注释为测试运行器指定运行测试。
  2. (我的首选)转到你的JUnit配置,运行>编辑配置。请注意“工作目录”'文本框。将/app(对于OSX和Linux)或\app(Windows)附加到文本框中写入的路径。再试一次,它应该可以工作。

答案 1 :(得分:65)

Android Studio上的同样问题。我已经解决了这个问题来编辑Unit4的配置。你可以遵循这些事情。

在Android Studio上。

  1. 编辑配置
  2. 在Junit中,您必须将工作目录更改为$ MODULE_DIR $。
  3. 重要的是 $ MODULE_DIR $

    您可以参考以下屏幕截图。感谢。

    enter image description here

    enter image description here

答案 2 :(得分:6)

我遇到了同样的错误,我们使用了几种口味和构建类型 因此,有一些步骤可以使其发挥作用:

  1. Android studio测试运行配置
  2. 您还必须在Windows中将工作目录设置为$ MODULE_DIR $。 http://robolectric.org/getting-started/应该这样说。

    1. 单元测试应该注释如下:

      @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class,sdk = 21,manifest =" src / main / AndroidManifest.xml",packageName =" com.example.yourproject") 公共类SomeFragmentTest {

答案 3 :(得分:5)

如果Android Studio 3.0仍然出现此错误,请确保您的gradle配置包含以下参数:

android {
    ...
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
}

答案 4 :(得分:2)

请注意,intellij 16 EAP在此$ MODULE_DIR $变量周围有一个错误(它指向错误的位置),导致测试因此异常而失败。见https://youtrack.jetbrains.com/issue/IDEA-149802#tab=History。应该在2016年1月中旬修复。

答案 5 :(得分:1)

您可以在此处引用相同的问题:https://github.com/robolectric/robolectric/issues/1648

您应该在测试代码中提及:

@Config(manifest = "src/main/AndroidManifest.xml", emulateSdk = 18)

这告诉robolectric你的清单文件在哪里。除非您更改目录值,否则这应该有效。

也尝试使用互联网上提供的模板。一切都在那里设置。您无需更改目录值。你可以从这里得到它:https://github.com/robolectric/deckard-gradle

编辑:我看到的方式是“build/intermediates/bundles/debug/AndroidManifest.xml "发生异常,但你说文件位于"app/build/intermediates/manifests/full/debug/AndroidManifest.xml",我猜这两个是不同的位置。请确保你有xml文件在build/intermediates/bundles/debug/AndroidManifest.xml "

答案 6 :(得分:0)

这是正确的@Christine。我也面临着确切的问题。事情是构建过程根本没有在中间体下创建bundle文件夹。而定制的robolectric转轮也没有用。这是自定义runner我 用过的。我还没有想出解决方案,但似乎问题可能与需要使用的构建工具版本有关。

[更新]在我的单元测试运行配置中更改工作目录以指向正在测试的模块根目录。[更新]

答案 7 :(得分:0)

我将AndroidStudio更新到2.3.3并且我的gradle插件也更新后出现此错误。 通过将working directory设置为$MODULE_DIR$并将robolectric依赖关系从testCompile 'org.robolectric:robolectric:3.0'更新为testCompile 'org.robolectric:robolectric:3.4.2'来解决问题。

请注意,在working directory版本旧时设置robolectric将无法解决此问题。

答案 8 :(得分:0)

 Hi All Iam new to RoboElectric was facing lot of struggle to run my first test 
please find the below steps which resolves all the issues.
Step 1: use the version in dependencies     
    testImplementation"org.robolectric:robolectric:4.0" in app.gradle    
step 2: 
in app.gradle inside android use below
testOptions {    
        unitTests {    
            includeAndroidResources = true      
        }    
    }    

第3步:在gradle.properties中粘贴以下内容
    enableUnitTestBinaryResources = true

它可以工作!!!