我在Android上实施单元测试时遇到了很多麻烦。作为一个简单的测试,我一直在尝试匹配从字符串资源中检索到的字符串:
String myString = myActivity.getResources().getString(R.string.testString));
然而,当单元测试时,这总是会导致空指针异常。这包括robolectric以及随Android sdk提供的Junit实现。
一种可能的解决方案是以类似于数据访问对象的方式处理资源检索。也就是说,创建一个接口,通过该接口访问字符串资源。这将允许我模拟访问字符串资源。同样,我可以将一个Activity的非Android依赖行为分成一个单独的pojo类。这将允许我使用标准Java测试工具运行单元测试。实际上,我可以将任何与Android基础架构相关的活动委托给一个接口。
这看起来很像是通过篮筐来进行单元测试。这值得么?有更可行的方法吗?
答案 0 :(得分:2)
public void testGetActivityResourceString() {
Activity myActivity = this.getActivity();
String myString = myActivity.getResources().getString(R.string.hello);
Assert.assertNotNull(myString);
}
在我在设置中创建活动之前。这个赠品是在文档中:
“对于每个测试方法调用,在第一次调用此方法之前,实际上不会创建Activity。”
这是一个很容易理解的麻烦。 HelloWorldTest的示例由于同样的原因不起作用。
这是完整的条目:
Public T getActivity() 自:API Level 3 获取正在测试的活动,必要时启动它。
对于每个测试方法调用,直到第一次调用此方法时才会实际创建Activity。
如果您希望为Activity提供自定义设置值,可以在第一次调用getActivity()之前调用setActivityIntent(Intent)和/或setActivityInitialTouchMode(boolean)。在Activity开始后调用它们将无效。
注意:可能无法从UI线程中启动测试中的活动。如果您的测试方法使用UiThreadTest进行注释,那么您的Activity将在测试方法运行之前自动启动。您仍然调用此方法以获取正在测试的活动。
答案 1 :(得分:0)
这是正常的:
public void testGetResourceString() {
assertNotNull(mActivity.getResources()
.getString(com.example.pkg.R.string.testString));
}
因为您没有提供任何代码而只提供getReousrces()
行,我会猜测您做错了什么:
ActivityInstrumentationTestCase2
com.example.pkg.R.string.testString
的原因。