Robolectric 说 "AndroidManifest.xml not found"

Robolectric says "AndroidManifest.xml not found"

在尝试让 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.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 存储库中,gradle 文件现在指的是本地 SNAPSHOT 构建,我确定Gradle 没有从远程仓库获取新版本。然后我将 RobolectricGradleTestRunner 复制到我的项目中,我更改了定义文件位置的行:它不包含模块名称。现在可以了。

您可以在这里参考相同的问题:https://github.com/robolectric/robolectric/issues/1648

你应该在你的测试代码中提到这一点:

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

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

也尝试使用 internet.Everything 上可用的模板,在 there.You 中设置不需要更改您的目录值。您可以从这里获取: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 "

我假设您正在尝试 运行 使用 JUnit 进行测试。您可以尝试两种不同的方法:

  1. 创建自定义测试运行ner class,如图here。检查 CustomTest运行ner 部分,您基本上可以在其中创建一个真正知道要使用的正确清单的 Test运行ner。用你的测试 运行ner 和 @Config 注释将你的测试指定为 运行。
  2. (我的首选)转到您的 JUnit 配置,运行 > 编辑配置。注意 'Working Directory' 文本框。将 /app(对于 OSX 和 Linux)或 \app(Windows)附加到文本框中写入的路径。再次尝试 运行ning 应该可以。

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

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

在 Android Studio 上也有同样的问题。我已经解决了这个问题来编辑 Unit4 的配置。你可以关注这些东西。

在 Android 工作室。

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

重要的是$MODULE_DIR$.

您可以参考以下截图。谢谢。

我遇到过同样的错误,我们使用了多种风格和构建类型 因此,有一些步骤可以让它发挥作用:

  1. Android 工作室测试 运行 配置

您也必须在 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") public class SomeFragmentTest {

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

在我将 AndroidStudio 更新到 2.3.3 并且我的 gradle 插件也更新后,我遇到了这个错误。 它通过将 working directory 设置为 $MODULE_DIR$ 并将 robolectric 依赖项从 testCompile 'org.robolectric:robolectric:3.0' 更新为 testCompile 'org.robolectric:robolectric:3.4.2' 来解决。

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

如果您在使用 Android Studio 3.0 时仍然遇到此错误,请确保您的 gradle 配置具有以下参数:

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

请找到以下解决所有问题的步骤。 第一步:使用dependencies中的版本

testImplementation"org.robolectric:robolectric:4.0" in app.gradle    

第二步:在app.gradle里面android使用下面

testOptions {    
    unitTests {    
        includeAndroidResources = true      
    }    
}    

步骤 3:in gradle.properties 粘贴下面的内容

enableUnitTestBinaryResources=true

有效!!!