我已经为我的应用程序设置了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
文件夹复制到新项目中:测试失败。
答案 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运行时中,这两种方式似乎同样有效。如果有任何建议,我没有检查官方文档。