【问题标题】:Robolectric says "AndroidManifest.xml not found"Robolectric 说“找不到 AndroidManifest.xml”
【发布时间】:2015-09-03 23:36:10
【问题描述】:

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

【问题讨论】:

    标签: android android-studio android-gradle-plugin robolectric


    【解决方案1】:

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

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

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

    testOptions {    
        unitTests {    
            includeAndroidResources = true      
        }    
    }    
    

    第三步:在 gradle.properties 中粘贴下面的内容

    enableUnitTestBinaryResources=true
    

    有效!!!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 非常感谢!那拯救了我的一天!我真的在为新的 gradle 插件 3.0.0、gradle 4.1 和 Android studio 3 苦苦挣扎。我的 Robolectric 测试疯了!现在一切都恢复正常了。
      • 谢谢。这可能为我节省了数小时的调试时间。
      【解决方案3】:

      在我将 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 不会解决此问题。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我也遇到过同样的错误,我们使用了几种风格和构建类型 因此,有一些步骤可以使其正常工作:

          1. Android Studio 测试运行配置

          您也必须在 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 {

          【讨论】:

          • 确保您正在导入正确的 BuildConfig - 我没有注意并从库中提取了 BuildConfig,这导致了与 OP 类似的问题。
          【解决方案6】:

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

          在 Android Studio 上。

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

          重要的是$MODULE_DIR$

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

          【讨论】:

          • 这是正确答案。这是一个影响 Mac 用户的问题。这实际上记录在 Robolectric 入门页面robolectric.org/getting-started
          • 我是 Robolectric 的新手;只是设置项目,可能做错了什么。不过,这个答案解决了我在 Windows 上的问题。
          • 但是为什么每次新的测试都需要它?有没有办法为所有测试指示“工作目录”?
          • 我不知道为什么基于其他 cmets 它应该可以工作,但我无法让它在 AS 3.5 上工作。还有其他人面临同样的情况吗?
          【解决方案7】:

          这是正确的@Christine。我也面临着确切的问题。问题是构建过程根本没有在中间体下创建 bundles 文件夹。并且定制的机器人电动跑步者也没有工作。这是自定义runner我 用过的。我还没有想出解决方案,但似乎问题可能与需要使用的构建工具版本有关。

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

            • 这是新版帖子建议bignerdranch.com/blog/…
            • 是的,添加“app”字符串是必不可少的。
            • 非常感谢 Chaparro!
            • 更好的解决方案是将工作目录设置为 $MODULE_DIR$,如 Robolectric 入门页面上的建议,robolectric.org/getting-started
            • 如果你使用 CI 怎么办?
            【解决方案9】:

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

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

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

            这会告诉 robolectric 您的清单文件在哪里。除非您更改目录值,否则这应该可以工作。

            还可以尝试使用 Internet 上提供的模板。所有内容都在其中设置。您无需更改目录值。你可以从这里得到它:https://github.com/robolectric/deckard-gradle

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

            【讨论】:

            • 我做到了。没用。此外,在 Robolectric RC3 中,它是“sdk=18”,而不是“emulateSdk=18”。
            • 我没有把xml文件放到build目录下。构建过程就是这样做的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-01
            • 1970-01-01
            • 2022-11-06
            • 2013-05-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多