Robolectric 2.4 中的 android.content.res.Resources$NotFoundException

标签 android robolectric robolectric-gradle-plugin

从命令行运行单元测试时,我无法加载资源。它在 IntelliJ 中运行良好。

我正在使用:

  • com.android.tools.build:gradle:1.1.3
  • org.robolectric:robolectric-gradle-plugin:1.0.1
  • org.robolectric:robolectric:2.4

我有以下项目结构(多模块):

+---module1
|   |   build.gradle
    |   \---src
    |       +---main
    |       |   |   AndroidManifest.xml
    |       |   |   
    |       |   +---res
    |       |   |   \---values
    |       |   |           strings.xml
    |       \---test
    |           \---java
    |               \---example
    |                    |   FooTest.java
+---module2
etc

我的测试(简化)如下所示:

@Config(emulateSdk = 18, reportSdk = 18, manifest = "./src/main/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class FooTest {

    @Test
    public void test() {
        String result = Robolectric.application.getString(R.string.error_message);

         assertThat(result, notNullValue());
    }
 }

我得到这个堆栈跟踪:

android.content.res.Resources$NotFoundException: unknown resource 2131361826
at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:311)
at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:69)
at android.content.res.AssetManager.getResourceText(AssetManager.java)
at android.content.res.Resources.getText(Resources.java:235)
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 org.robolectric.shadows.ShadowContext.getString(ShadowContext.java:41)
at org.robolectric.shadows.ShadowContextWrapper.getString(ShadowContextWrapper.java:96)
at android.content.Context.getString(Context.java)

注意:我对 Gradle 很陌生,所以很可能某处存在错误配置。我假设通过遵循项目结构约定,我不需要指定在哪里可以找到资源。我尝试指定它们但没有任何运气:

android {
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
        }
    }
}

最佳答案

在调查过程中,我们找到了问题的原因。如果您使用 android gradle plugin v1.1.x 那么您通常不需要 robolectric gradle plugin

请注意,错误版本的 robolectric gradle plugin 会破坏您的测试。

关于Robolectric 2.4 中的 android.content.res.Resources$NotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29533041/

相关文章:

android - Robolectric 测试在启动时挂起 - 从 sonatype 传输

java - 1970 日期选择器日期

android studio robolectric 测试没有覆盖

android - 使用 Robolectric 测试 Activity WebView,而不是加载页面

android - Robolectric-Gradle 插件运行单一测试

使用 Robolectric 3.6.1 时出现 java.lang.IllegalAccessError

android - 从 DataStore 读取一次值以更新 fragment 中的选项菜单复选框状态

android - Google Books API 403 访问未配置

java - 将数据传递给另一个类

android - 使用 Robolectric for Android 测试 TextView 文本颜色