2

Since I migrated a project to Android Studio, I am getting following error when I want to run my tests:

WARNING: no system properties value for ro.build.date.utc
DEBUG: Loading resources for com.persistpalapp.android from ./../app/src/main/res...
java.lang.IllegalStateException: android.content.res.Resources$NotFoundException: String resource ID #0x7f0e0064
    at com.persistpalapp.android.RPApplication.init(RPApplication.java:107)
    at com.persistpalapp.android.RPApplication.onCreate(RPApplication.java:83)
    at com.persistpalapp.android.TestRPApplication.onCreate(TestRPApplication.java:35)
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:126)
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:440)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:222)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:77)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:56)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:158)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7f0e0064
    at android.content.res.Resources.getText(Resources.java:239)
    at org.robolectric.shadows.ShadowResources.getText(ShadowResources.java:363)
    at android.content.res.Resources.getText(Resources.java)
    at android.content.res.Resources.getString(Resources.java:325)
    at com.persistpalapp.android.RPApplication.init(RPApplication.java:102)
    at com.persistpalapp.android.RPApplication.onCreate(RPApplication.java:83)
    at com.persistpalapp.android.TestRPApplication.onCreate(TestRPApplication.java:35)
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:126)
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:440)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:222)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:77)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:56)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:158)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    ... 1 more

java.lang.RuntimeException: java.lang.IllegalStateException: android.content.res.Resources$NotFoundException: String resource ID #0x7f0e0064
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:226)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:77)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:56)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:158)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.IllegalStateException: android.content.res.Resources$NotFoundException: String resource ID #0x7f0e0064
    at com.persistpalapp.android.RPApplication.init(RPApplication.java:107)
    at com.persistpalapp.android.RPApplication.onCreate(RPApplication.java:83)
    at com.persistpalapp.android.TestRPApplication.onCreate(TestRPApplication.java:35)
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:126)
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:440)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:222)
    ... 19 more
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7f0e0064
    at android.content.res.Resources.getText(Resources.java:239)
    at org.robolectric.shadows.ShadowResources.getText(ShadowResources.java:363)
    at android.content.res.Resources.getText(Resources.java)
    at android.content.res.Resources.getString(Resources.java:325)
    at com.persistpalapp.android.RPApplication.init(RPApplication.java:102)
    at com.persistpalapp.android.RPApplication.onCreate(RPApplication.java:83)
    at com.persistpalapp.android.TestRPApplication.onCreate(TestRPApplication.java:35)
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:126)
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:440)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:222)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:77)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:56)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:158)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    ... 1 more


Process finished with exit code 255

My testclass looks like this:

@Config(manifest = C.MANIFEST, emulateSdk = 18, reportSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class JSONDataHelperTest {...}

Any ideas?

================ MORE INFO ==================

I am using

  • Android Studio 1.1 Beta 4
  • Roboletric 2.4
  • com.android.tools.build:gradle:1.0.1
  • com.github.jcandksolutions.gradle:android-unit-test:2.1.1
  • org.robolectric:robolectric-gradle-plugin:0.12.+

My project structure (modules):

  1. app: main app
  2. robolectric-tests: testing classes

My robolectric-tests build.gradle:

evaluationDependsOn(':app')
apply plugin: 'java'

repositories {
    mavenCentral()

    def androidHome = System.getenv("ANDROID_HOME")
    // check that androidHome points to the android home dir
    println("android home dir: "+androidHome)

    maven {
        url "$androidHome/extras/android/m2repository/"
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    def androidModule = project(':app')
    compile androidModule

    println "androidModule classpath: "+androidModule.android.applicationVariants.toList().first().javaCompile.classpath
    testCompile androidModule.android.applicationVariants.toList().first().javaCompile.classpath
    testCompile androidModule.android.applicationVariants.toList().first().javaCompile.outputs.files
    testCompile files(androidModule.plugins.findPlugin("com.android.application").getBootClasspath())

    //testCompile 'junit:junit:4.12-beta-2'
    testCompile 'org.robolectric:robolectric:2.4'
    testCompile 'org.mockito:mockito-core:1.10.8'
    testCompile 'org.assertj:assertj-core:1.7.0'
    testCompile 'com.squareup:fest-android:1.0.8'
}



//prevent the "superClassName is empty" error for classes not annotated as tests
tasks.withType(Test) {
    scanForTestClasses = false
    include "**/*Test.class" // whatever Ant pattern matches your test class files
}
stoefln
  • 14,498
  • 18
  • 79
  • 138
  • to less informations. which android studio version have you? which plugin do you use to support robolectric in andorid studio? how looks you project structure? – nenick Feb 12 '15 at 18:10
  • @nenick ok, added more info – stoefln Feb 12 '15 at 22:00
  • @stoefln Why do you have so many "hacks" in your `build.gradle`? – Jared Burrows Mar 01 '15 at 01:35
  • @JaredBurrows because I don't know how to include the classes of my main module instead. The test classes are in a separate library module. Usually libraries don't reference the main app. I copied the code, but I really wonder why the whole setup is so damn complicated. I spent hours (almost days) of debugging. Kind of frustrating. – stoefln Mar 01 '15 at 02:38
  • @stoefln I just found where you got that `build.gradle`. I understand that robolectric + latest android gradle build tools is difficult to setup. Google needs to provide either support for Robolectric or their own version of Robolectric. – Jared Burrows Mar 01 '15 at 02:49
  • @stoefln Have you resolved this? Robolectric 3.0+ has resolved most of these issues. – Jared Burrows May 18 '15 at 17:01
  • The solution worked for me is here: https://stackoverflow.com/a/45571884/4802664 – MD TAREQ HASSAN Aug 08 '17 at 15:04

1 Answers1

0

The error message looks like that no resources are found ;) explicit the content from your string.xml

Lets start ..

com.github.jcandksolutions.gradle:android-unit-test:2.1.1

This plugin support explicit to have your tests in the same module

  • app
    • src/main/java
    • src/test/java

For extra test module you must use a different plugin to support robolectric. You can also have extra test modules with the jcandksolutions plugin but this would be more a application->library relationship instead of test->application/library.

testCompile androidModule.android.applicationVariants.toList().first().javaCompile.classpath testCompile androidModule.android.applicationVariants.toList().first().javaCompile.outputs.files testCompile files(androidModule.plugins.findPlugin("com.android.application").getBootClasspath())

Nice try but I guess this will not give you all classes and resources. This lines aren't necessary eval which plugin you will use.

What now ...

Questions is how should you project structure look? Is it important for you to have tests in a separate module?

With separated test module use https://github.com/novoda/gradle-android-test-plugin. For one module stay with jcandksolutions or you could also try the plugin from robolectric team https://github.com/robolectric/robolectric-gradle-plugin

All plugins have examples how to use them:

For 1.0 version from Android Studio I recommend jcandksolutions, because of much better integration into Android Studio.

With Android Studio 1.1 Beta you can avoid any of this plugins, or use the current master from robolectric team.

Here is a example without plugins https://github.com/nenick/AndroidStudioAndRobolectric and a guide how you do it self step by step http://nenick-android.blogspot.de/2015/02/android-studio-110-beta-4-and.html

nenick
  • 7,340
  • 3
  • 31
  • 23
  • I tried with your single-module approach (without plugins), but ended up with the same problem (string resource not found). I also tried to run your example project and failed. I am not able to swtich "Test Artifact", see here: http://i.imgur.com/g2BYCnT.png – stoefln Feb 13 '15 at 21:56
  • Did you follow step 3 and 4 from this guide http://tools.android.com/tech-docs/unit-testing-support ? – nenick Feb 14 '15 at 06:56
  • The image looks like you picked a different example. I doesn't mean https://github.com/nenick/android-gradle-template. The example without plugins is https://github.com/nenick/AndroidStudioAndRobolectric – nenick Feb 14 '15 at 07:02
  • sorry, you are right. Tried the other one- still gives me a "ResourceNotFound" Exception. I am calling "getResources()" in the Application class. Could this be the source of the problem? – stoefln Feb 17 '15 at 17:24
  • works the sample robolectric test for you without your code/modifications? when yes then add an application class to my example and access the resources how you do it in your project. When this fails create a gist and I will take a look. Another approach is to follow the guide step by step with your project. Maybe you find a situation where you get another exception as expected. – nenick Feb 17 '15 at 18:23