运行Roboelectric测试时出现了Resources$NotFoundException。

7

我刚刚在一款新应用中安装了Roboelectric 3.2.2,并编写了我的第一个简单测试:

@RunWith(RobolectricTestRunner.class)
@Config(manifest="src/main/AndroidManifest.xml",
    packageName="my.pacakge.name.debug")
public class MainActivityTest {

    @Test
    public void clickButton() {
        MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);
        String text = ((TextView)mainActivity.findViewById(R.id.text_main)).getText().toString();
        assertEquals("Should equal Hello World!", "Hello World!", text);
    }
}

我已经按照这里这里的所有设置和说明进行了操作,但每次运行测试时仍然出现以下错误:
android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0 in packages [android, my.package.name.debug]

这个异常出现在测试的第一行,我正在调用setupActivity()


你使用的是哪个版本的 Robolectric?我建议使用最新版本,并删除 robolectric gradle plugin,同时从 Config 中删除清单和包名规范。 - Eugen Martynov
你解决了你的问题吗?如果是,那么你是怎么解决的? - MD TAREQ HASSAN
2个回答

2

这对我有用:添加@Config(manifest = "src/main/AndroidManifest.xml")


@Config(manifest = "src/main/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {

    @Test
    public void testSomething() throws Exception {
        assertTrue(Robolectric.setupActivity(MainActivityTest .class) != null);
    }
}   

注1:如果你在创建新项目时仍然遇到同样的错误

原因与工作目录不同有关,解决方法在这里:https://dev59.com/jojca4cB1Zd3GeqPsywx#31469526

注2:使用

Android Studio 3.0 (canary 9)
Gradle 4.1
Android Gradle插件3.0.0-alpha9
robolectric: 3.4.2

Gradle

buildscript {

    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha9'
    }
}    

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'


    testImplementation 'junit:junit:4.12'

    // Espresso
    androidTestImplementation 'com.android.support.test:runner:1.0.0'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.0'

    // Robolectric
    testImplementation 'org.hamcrest:hamcrest-library:1.3'
    testImplementation 'org.robolectric:robolectric:3.4.2'
}

0

当我使用自定义的RobolectricTestRunner并提供缺失的系统属性时,这个插件对我很有效。

public class CustomRobolectricTestRunner extends RobolectricTestRunner {

  public CustomRobolectricTestRunner(Class<?> testClass) throws InitializationError {
    super(testClass);
    String buildVariant = BuildConfig.BUILD_TYPE + (BuildConfig.FLAVOR.isEmpty()? "" : "/" + BuildConfig.FLAVOR);
    System.setProperty("android.package", BuildConfig.APPLICATION_ID);
    System.setProperty("android.manifest", "build/intermediates/manifests/full/" + buildVariant + "/AndroidManifest.xml");
    System.setProperty("android.resources", "build/intermediates/res/" + buildVariant);
    System.setProperty("android.assets", "build/intermediates/assets/" + buildVariant);
  }
}

编辑: 在您的单元测试运行配置中,您还必须使用不同的工作目录。最好更改默认配置并使用$MODULE_DIR$ https://code.google.com/p/android/issues/detail?id=158015#c5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接