Robolectric says “AndroidManifest.xml not found”

2019-02-02 06:03发布

While trying to get Robolectric RC3 to work in Android Studio, I get

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)

I tried

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

and I tried setting the manifest location in my TestRunner, nothing worked. In the file system I see that the manifest is in

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

not in the location Robolectric is looking for it. At one point the manifest just got ignored, then a similar issue occurred for resources, the app or Robolectric couldn't find a raw resource my app uses. This is in my build file:

   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']
    }
}

How do I tell Robolectric where to look for a manifest, and more importantly, where to look for resources?

Edit: I have checked out Robolectric from github, I've built it, installed it in my local .m2 repo, the gradle file now refers to the local SNAPSHOT build, and I made sure Gradle doesn't get a new version from a remote repo. Then I copied the RobolectricGradleTestRunner to my project, I have changed the lines where the file locations are defined: it didn't contain the module name. Now it works.

8条回答
做个烂人
2楼-- · 2019-02-02 06:04

I'm assuming you're trying to run the tests with JUnit. You can try two different things:

  1. Create a Custom TestRunner class, as shown here. Check the CustomTestRunner section, where you basically create a TestRunner that actually knows the right manifest to use. Specify your tests for them to run with your test runner, with the @Config annotation.
  2. (My preferred choice) Go the your JUnit configuration, Run > Edit Configurations. Notice the 'Working Directory' textbox. Append /app (for OSX and Linux) or \app (Windows), to the path written in the textbox. Try running again and it should work.
查看更多
爷、活的狠高调
3楼-- · 2019-02-02 06:04

I have faced same errors, We used several flavors and buildtypes So, there are steps to make it working:

  1. Android studio tests run configuration

You have to set working directory to $MODULE_DIR$ in Windows too. http://robolectric.org/getting-started/ should say that.

  1. Unit test should be annotated like this:

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

查看更多
成全新的幸福
4楼-- · 2019-02-02 06:06

Same problem on Android Studio. I've solved this problem to edit the configuration of Unit4. you can follow these things.

On Android Studio.

  1. Edit Configurations
  2. In Junit, you have to change the working directory to $MODULE_DIR$.

The important thing is $MODULE_DIR$.

you can reference the following screenshot. thanks.

enter image description here

enter image description here

查看更多
做自己的国王
5楼-- · 2019-02-02 06:06

You Can refer the same issue here:https://github.com/robolectric/robolectric/issues/1648

You should mention this in your test code:

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

This tells the robolectric where your manifest file is. This should work unless you change your directory values.

also try to use the template available on the internet.Everything is setup in there.You don't need to change your directory values. You can get it from here:https://github.com/robolectric/deckard-gradle

Edit: The way i see is the exception occurs at "build/intermediates/bundles/debug/AndroidManifest.xml " but you are saying the file is at "app/build/intermediates/manifests/full/debug/AndroidManifest.xml",I guess these two are different locations. Please make sure you have the xml file at build/intermediates/bundles/debug/AndroidManifest.xml "

查看更多
何必那么认真
6楼-- · 2019-02-02 06:08

In case you are still getting this error with Android Studio 3.0, please be sure that your gradle configuration has these parameters:

android {
    ...
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
}
查看更多
对你真心纯属浪费
7楼-- · 2019-02-02 06:09

I had this error after I updated AndroidStudio to 2.3.3 and my gradle plugin was updated too. It was solved by setting working directory to $MODULE_DIR$ and also updating robolectric dependency from testCompile 'org.robolectric:robolectric:3.0' to testCompile 'org.robolectric:robolectric:3.4.2'.

Note that setting working directory while robolectric version is old won't resolve it.

查看更多
登录 后发表回答