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

Robolectric 2.4中的android.content.res.Resources$NotFoundException,android,robolectric,robolectric-gradle-plugin,Android,Robolectric,Robolectric Gradle Plugin,从命令行运行单元测试时,我在加载资源时遇到问题。它在IntelliJ中运行良好 我正在使用: com.android.tools.build:gradle:1.1.3 org.roblectric:roblectric gradle插件:1.0.1 org.roblectric:roblectric:2.4 我有以下项目结构(多模块): 我的测试(简化)如下所示: @Config(emulateSdk = 18, reportSdk = 18, manifest = "./src/main/

从命令行运行单元测试时,我在加载资源时遇到问题。它在IntelliJ中运行良好

我正在使用:

  • com.android.tools.build:gradle:1.1.3
  • org.roblectric:roblectric gradle插件:1.0.1
  • org.roblectric:roblectric:2.4
我有以下项目结构(多模块):

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

@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']
        }
    }
}

在调查过程中,我们找到了问题的原因。如果您使用的是
androidgradlepluginv1.1.x
,那么您就不需要共同使用
robololectricgradleplugin


请小心,不正确版本的
robolectric gradle插件将破坏您的测试。

您能否尝试将配置清单更改为
module1/src/main/AndroidManifest.xml
。它并不能解决您的问题(现在您可能会在AS中遇到失败的测试),但只需快速检查问题。我尝试并得到以下结果:>为属性“manifest”指定的文件“/opt/buildagent/work/22b7e45eb23ab445/module1/module1/src/main/AndroidManifest.xml”不存在。猜错了。你能在配置中删除清单文件吗?另一个问题是你有什么版本的android gradle插件?通过android gradle 1.1.x,你可以删除gradle robolectric插件的使用
android {
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
        }
    }
}