资源$ NotFoundException与Robolectric和Flavors

时间:2014-06-03 08:34:47

标签: android robolectric

我在deckard-gradle模板中看到配置robolectric,一切都很好,除了在通过终端启动robolectric测试时我收到此错误消息的事实:

java.lang.RuntimeException:android.content.res.Resources $ NotFoundException:unknown resource 2131296262

我知道这与我在build.gradle中使用的不同风格有关。我已经在为Robolectric使用自定义的TestRunner,但它无论如何都没有用,我试过2.3 + 2.4 SNAPSHOT。

我的TestRunner看起来像这样:

@Override
protected AndroidManifest getAppManifest(Config config) {
    String manifestProperty = System.getProperty("android.manifest");
    if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) {
        String resProperty = System.getProperty("android.resources");
        String assetsProperty = System.getProperty("android.assets");
        return new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty),
                Fs.fileFromPath(assetsProperty));
    }
    AndroidManifest appManifest = super.getAppManifest(config);
    appManifest.setPackageName("com.example.android");
    return appManifest;
}

我做错了什么?我的口味被宣布为:

 flavors {
            flavor1 {
                packageName = "com.example.android"
                buildConfigField "String", "GCM_SENDER_ID", "\"807347333395\""
                buildConfigField "java.util.Locale", "locale", "java.util.Locale.GERMANY"
                buildName = "./gittag.sh ${name}".execute([], project.rootDir).text.trim()
                buildConfigField "String", "BUILD_NAME", "\"${buildName}\""
                versionName = "2.0.4"
                versionCode = 21
            }
}

如果有人能为我提供更多信息,那将是非常棒的!非常感谢!

2 个答案:

答案 0 :(得分:1)

我刚刚解决了与Robolectric(版本:robolectric-2.4-jar-with-dependencies.jar)相同的问题,并返回了未知资源,同时从不同的值加载资源 - *文件夹,例如:

<resources>
    <string name="screen_type">10-inch-tablet</string>
</resources>

在我的情况下,我想识别不同的设备。出于这个原因,我在以下文件夹中创建了screen.xml:

values/screen.xml - mobile
values-sw600dp/screen.xml - 7-inch tablet
values-sw720dp/screen.xml - 10-inch tablet

我的工作区如下:

workspace
   \-ExProj
       \-exProj
            \-src
                \-exProj
                    \-AndroidManifest.xml
   \-ExProjTest

使用Robolectric进行单元测试:

@RunWith(RobolectricTestRunner.class)
@Config(manifest = "./../ExProj/exProj/src/exProj/AndroidManifest.xml")
public class UtilityTest {

  @Test
   @Config(qualifiers = "sw720dp")
    public void testIfDeviceIsTablet() throws Exception {
     System.out.println(Robolectric.application.getString(R.string.screen_type));
    }
}

以上测试代码在控制台上打印出来:10英寸平板电脑......

答案 1 :(得分:0)

尝试在测试中设置清单的路径,如下所示:

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