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

6

当我从命令行运行单元测试时,我在加载资源时遇到了麻烦。在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']
        }
    }
}

你能否尝试将配置清单更改为module1/src/main/AndroidManifest.xml。这并不能解决你的问题(现在你可能会在AS中遇到测试失败),但只是快速检查问题。 - Eugen Martynov
你好,我尝试了一下并得到了这个错误信息:
属性'manifest'指定的文件'/opt/buildagent/work/22b7e45eb23ab445/module1/module1/src/main/AndroidManifest.xml'不存在。
- Alix
猜错了。你能完全删除配置文件中清单文件的提及吗? - Eugen Martynov
清楚了!最后一个问题——你的Debug构建是否会更改应用程序ID,比如添加“.debug”或其他内容? - Eugen Martynov
1
使用 Android Gradle 1.1.x,您可以删除 Gradle Robolectric 插件的使用。 - Eugen Martynov
显示剩余3条评论
1个回答

1
在调查过程中,我们发现了问题的原因。如果您使用的是android gradle plugin v1.1.x,则不需要通常使用robolectric gradle plugin
请注意,robolectric gradle plugin的错误版本将破坏您的测试。

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