Android单元测试和界面

时间:2011-04-11 21:41:21

标签: android unit-testing

我在Android上实施单元测试时遇到了很多麻烦。作为一个简单的测试,我一直在尝试匹配从字符串资源中检索到的字符串:

String myString = myActivity.getResources().getString(R.string.testString));

然而,当单元测试时,这总是会导致空指针异常。这包括robolectric以及随Android sdk提供的Junit实现。

一种可能的解决方案是以类似于数据访问对象的方式处理资源检索。也就是说,创建一个接口,通过该接口访问字符串资源。这将允许我模拟访问字符串资源。同样,我可以将一个Activity的非Android依赖行为分成一个单独的pojo类。这将允许我使用标准Java测试工具运行单元测试。实际上,我可以将任何与Android基础架构相关的活动委托给一个接口。

这看起来很像是通过篮筐来进行单元测试。这值得么?有更可行的方法吗?

2 个答案:

答案 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()行,我会猜测您做错了什么:

  1. 您没有为测试使用正确的基类,因为您需要系统基础结构,所以使用ActivityInstrumentationTestCase2
  2. 您正在使用测试项目的资源而不是您正在测试的项目,这就是我的示例中id为com.example.pkg.R.string.testString的原因。