Robolectric找不到AndroidManifest.xml

时间:2016-02-29 20:38:24

标签: android android-manifest robolectric

此测试最初运行良好。几天后检查了一个新的分支(许多其他开发人员的提交),它不再有效。

mylibrary库模块中的测试类:

import com.company.mylibrary.BuildConfig;

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, manifest = "src/main/AndroidManifest.xml", sdk = 21)
public class MyTest {

我也尝试过:

@Config(constants = BuildConfig.class, sdk = 21)
@Config(constants = BuildConfig.class, manifest = Config.NONE, sdk = 21)

在图书馆模块的build.gradle

dependencies {
    .
    .
    testCompile 'org.robolectric:robolectric:3.0'

在AS内部运行时出现错误消息: java.lang.RuntimeException: build/intermediates/manifests/full/debug/AndroidManifest.xml not found or not a file; it should point to your project's AndroidManifest.xml

从命令行运行时出现错误消息: com.company.mylibrary.framework1.feature1.MyTest > testMethod STANDARD_ERROR java.lang.RuntimeException: build/intermediates/manifests/full/debug/AndroidManifest.xml not found or not a file; it should point to your project's AndroidManifest.xml

A) Don't know why it is looking there for the manifest B) That file/directory does not exist C) src/main/AndroidManifest.xml does exist

我尝试过的事情: - deleted the build directory in that library module - restarted Android Studio - Build/Clean - Build/Rebuild Project - run the test (both inside AS and from command line) - and tried different versions of the @Config notation

似乎处于一种我无法清楚的状态。

我正在使用MacBook Pro。 Android Studio 2.0 beta5

3 个答案:

答案 0 :(得分:8)

您需要将测试运行配置中的工作目录设置为模块目录。enter image description here

答案 1 :(得分:0)

好吧,我已经多次解决了你现在面临的问题,找到了适合自己的解决方案。

通常,如果您的测试逻辑不需要访问应用程序的资源,则值得使用通常的RobolectricTestRunner,因为与RobolectricGradleTestRunner下的测试执行时间相比,测试执行的时间相对较短。

如果由于某种原因,您需要访问特定的AndroidManifest.xml文件,IMO最好提供测试文件,而不是对项目的文件进行操作。

说'测试文件'我是指以下内容: 让我们首先定义哪些方法可以帮助我们获取资源文件的路径。目标是能够在Android Studio下执行测试,以及通过CLI(gradle :project:testBuildTypeUnitTest

进行更相关的测试
  1. Java的System类:System.getProperty('user.dir')返回User的当前工作目录。获取我们所在的当前目录可以帮助我们获取运行测试所需资源的路径。
  2. 覆盖RobolectricGradleTestRunner。要创建我们的自定义测试运行器,我们需要AndroidManifest.xmlres目录和assets目录路径:

    public class CompassApplicationRobolectricTestRunner extends RobolectricGradleTestRunner {
    
    private static final int TARGET_SDK_VERSION = Build.VERSION_CODES.LOLLIPOP;
    private static final int MIN_SDK_VERSION = Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1;
    
    public CompassApplicationRobolectricTestRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }
    
    @Override
    protected AndroidManifest getAppManifest(Config config) {
    
        final String manifestPath = PathResolver.resolveAndroidManifestPath();
        final String resourcesPath = PathResolver.resolveResPath();
        final String assetsPath = PathResolver.resolveAssetsPath();
    
        AndroidManifest manifest = new AndroidManifest(
                Fs.fileFromPath(manifestPath),
                Fs.fileFromPath(resourcesPath),
                Fs.fileFromPath(assetsPath)) {
            @Override
            public int getTargetSdkVersion() {
                return TARGET_SDK_VERSION;
            }
    
            @Override
            public int getMinSdkVersion() {
                return MIN_SDK_VERSION;
            }
        };
    
        return manifest;
    }
    }
    
  3. 下面是指向我的示例的链接。然而,它是在不久前开发的,从时间的角度来看,我认为它可以做得更优雅,所以如果你决定将这个解决方案应用到你的项目中,那么组织你的路径常量是静态的和不可变的:

    https://github.com/dawidgdanski/android-compass-api/blob/master/app-tests/src/test/java/pl/dawidgdanski/compass/PathResolver.java

    值得记住的是File.separator返回系统的默认目录分隔符。在提供与默认分隔符号分隔的系统无关路径时,它非常有用。

    最后,如果上述解决方案不是您想要遵循的解决方案,请阅读有关设置测试环境的正确文章:

    http://artemzin.com/blog/how-to-mock-dependencies-in-unit-integration-and-functional-tests-dagger-robolectric-instrumentation/

    希望能解决你的问题。

答案 2 :(得分:0)

在我的情况下,我在Android Studio内手动运行单个测试(右键单击并运行),Roboelectric需要一个RELEASE版本。上面的问题是关于调试但我的测试运行由于某种原因想要一个最明显的发布版本。

java.lang.RuntimeException: build/intermediates/manifests/release/AndroidManifest.xml not found or not a file; it should point to your project's AndroidManifest.xml

我从未在此项目中完成生产构建,因此从未创建过构建目录。

稍微摔跤后没有成功(在配置中设置路径,尝试在我的CustomRoboelectric文件中获取路径),我只生成了一个生成版本,以便我使用清单创建了发布路径,一切正常。

所以我的解决方案就是运行构建以创建Roboelectric想要的东西。