使用getBoolean()和getInteger()的Robolectric Resources $ NotFoundException

时间:2014-02-24 09:34:15

标签: android robolectric

我已经为我的应用程序设置了robolectric单元测试,遇到了一个用XML定义的整数和布尔资源的问题。我在单独的项目中进行了测试,但是将工作目录设置为正在测试的项目,如this answer中所述。 Robolectric似乎正确地找到了一些资源,因为getString(...)getDrawable(...)工作正常。但是,getBoolean(...)getInteger(...)失败并显示Resources$NotFoundException

我愚弄了其中一个测试用例以重现行为:

@Test
public void testResources() {

    TestActivity activity = controller.get();
    String theString = activity.getString(R.string.ab_request); // works
    Drawable theDrawable = activity.getResources().getDrawable(R.drawable.ab_back); // works
    boolean theBool = activity.getResources().getBoolean(R.bool.isRelease); // fails
    int theInt = activity.getResources().getInteger(R.integer.act_noNetwork); // fails
}

这是Robolectric的已知错误吗?我搜索了一会儿,却找不到有同样问题的人。

更新 它似乎与我的res文件夹有关。我从一个新的Android项目和上面的单个测试开始。然后我添加了我的项目依赖项:测试仍然运行。我将res文件夹复制到新项目中:测试失败。

1 个答案:

答案 0 :(得分:0)

我发现了错误。事实证明,Robolectric does not support the item tag用于在XML中声明的资源。我的资源被宣布为

<item type="bool" name="isRelease">false</item>
<item type="integer" name="act_noNetwork">12345</item>

但是,在解析布尔值时,Robolectric XML解析器只检查bool个节点,而不检查item个节点。整数也是如此,我没有检查过其他类型。我将声明改为:

<bool name="isRelease">false</bool>
<integer name="act_noNetwork">12345</integer>

现在Robolectric正确解析资源。请注意,在正常的Android运行时中,这两种方式似乎同样有效。如果有任何建议,我没有检查官方文档。