Robolectric中的资源NotFoundException

时间:2015-02-12 16:06:39

标签: android testing robolectric

由于我将项目迁移到Android Studio,因此当我想运行测试时出现以下错误:

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

我的测试类看起来像这样:

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

有什么想法吗?

================更多信息==================

我正在使用

  • Android Studio 1.1 Beta 4
  • Roboletric 2.4
  • com.android.tools.build:gradle:1.0.1
  • com.github.jcandksolutions.gradle:机器人单元测试:2.1.1
  • org.robolectric:robolectric-gradle这个-插件:0.12 +

我的项目结构(模块):

  1. app:主应用
  2. robolectric-tests:测试类
  3. 我的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
    }
    

1 个答案:

答案 0 :(得分:0)

错误消息看起来没有找到资源;)显示string.xml中的内容

让我们开始..

  

com.github.jcandksolutions.gradle:机器人单元测试:2.1.1

此插件支持显式在同一模块中进行测试

  • 应用
    • 的src /主/ JAVA
    • 的src /测试/ JAVA

对于额外的测试模块,您必须使用不同的插件来支持robolectric。您还可以使用jcandksolutions插件获得额外的测试模块,但这更像是应用程序 - >库关系,而不是test->应用程序/库。

  

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

很好的尝试,但我想这不会给你所有的课程和资源。这行不是eval你将使用的插件。

现在......

问题是你应该如何预测结构外观?在单独的模块中进行测试对您来说很重要吗?

使用分开的测试模块使用https://github.com/novoda/gradle-android-test-plugin。 对于一个模块保留jcandksolutions,或者您也可以尝试robolectric团队的插件https://github.com/robolectric/robolectric-gradle-plugin

所有插件都有如何使用它们的示例:

对于Android Studio的1.0版本,我推荐使用jcandksolutions,因为它可以更好地集成到Android Studio中。

使用Android Studio 1.1 Beta,您可以避免使用任何此类插件,或使用robolectric团队的当前主控。

以下是没有插件https://github.com/nenick/AndroidStudioAndRobolectric的示例,以及如何逐步执行此操作的指南http://nenick-android.blogspot.de/2015/02/android-studio-110-beta-4-and.html