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 进行测试。您可以尝试两种不同的方法:
- 创建自定义测试运行ner class,如图here。检查 CustomTest运行ner 部分,您基本上可以在其中创建一个真正知道要使用的正确清单的 Test运行ner。用你的测试 运行ner 和
@Config
注释将你的测试指定为 运行。
- (我的首选)转到您的 JUnit 配置,运行 > 编辑配置。注意 'Working Directory' 文本框。将
/app
(对于 OSX 和 Linux)或 \app
(Windows)附加到文本框中写入的路径。再次尝试 运行ning 应该可以。
没错@Christine。我也面临着确切的问题。问题是构建过程根本没有在中间体下创建 bundles 文件夹。而自定义 robolectric 运行ner 也没有用。这里是我的习惯runner
用过的。我还没有想出解决方案,但似乎问题可能与需要使用的构建工具版本有关。
[更新] 在我的单元测试 运行 配置中更改工作目录以指向正在测试的模块根目录对我有用。[更新]
在 Android Studio 上也有同样的问题。我已经解决了这个问题来编辑 Unit4 的配置。你可以关注这些东西。
在 Android 工作室。
- 编辑配置
- 在 Junit 中,您必须将工作目录更改为 $MODULE_DIR$。
重要的是$MODULE_DIR$.
您可以参考以下截图。谢谢。
我遇到过同样的错误,我们使用了多种风格和构建类型
因此,有一些步骤可以让它发挥作用:
- Android 工作室测试 运行 配置
您也必须在 Windows 中将工作目录设置为 $MODULE_DIR$。 http://robolectric.org/getting-started/ 应该这么说。
单元测试应该这样注释:
@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
有效!!!
在尝试让 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 进行测试。您可以尝试两种不同的方法:
- 创建自定义测试运行ner class,如图here。检查 CustomTest运行ner 部分,您基本上可以在其中创建一个真正知道要使用的正确清单的 Test运行ner。用你的测试 运行ner 和
@Config
注释将你的测试指定为 运行。 - (我的首选)转到您的 JUnit 配置,运行 > 编辑配置。注意 'Working Directory' 文本框。将
/app
(对于 OSX 和 Linux)或\app
(Windows)附加到文本框中写入的路径。再次尝试 运行ning 应该可以。
没错@Christine。我也面临着确切的问题。问题是构建过程根本没有在中间体下创建 bundles 文件夹。而自定义 robolectric 运行ner 也没有用。这里是我的习惯runner 用过的。我还没有想出解决方案,但似乎问题可能与需要使用的构建工具版本有关。
[更新] 在我的单元测试 运行 配置中更改工作目录以指向正在测试的模块根目录对我有用。[更新]
在 Android Studio 上也有同样的问题。我已经解决了这个问题来编辑 Unit4 的配置。你可以关注这些东西。
在 Android 工作室。
- 编辑配置
- 在 Junit 中,您必须将工作目录更改为 $MODULE_DIR$。
重要的是$MODULE_DIR$.
您可以参考以下截图。谢谢。
我遇到过同样的错误,我们使用了多种风格和构建类型 因此,有一些步骤可以让它发挥作用:
- Android 工作室测试 运行 配置
您也必须在 Windows 中将工作目录设置为 $MODULE_DIR$。 http://robolectric.org/getting-started/ 应该这么说。
单元测试应该这样注释:
@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
有效!!!