2011-04-11 83 views
1

我在Android上执行单元测试时遇到了相当多的麻烦。作为一个简单的测试,我一直试图以匹配字符串资源中检索到的字符串:Android单元测试和接口

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

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

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

这似乎是很多跳过箍环来进行单元测试。这值得么?有没有更可行的方法?

回答

2

原来,问题是活动必须在实际的测试方法中得到。因此,例如,我的方法现在看起来像这样:

public void testGetActivityResourceString() { 

    Activity myActivity = this.getActivity(); 
    String myString = myActivity.getResources().getString(R.string.hello); 
    Assert.assertNotNull(myString); 
} 

而我在安装程序中创建活动之前。这个赠品在文档中:

“对于每个测试方法调用,只有在第一次调用此方法时才会实际创建Activity。”

这是一个真正的麻烦要弄清楚。 HelloWorldTest的例子不能用于同样的原因。

下面是完整的条目:

公共牛逼getActivity() 自:API等级3 获取被测活动,必要时启动它。

对于每个测试方法调用,只有在第一次调用此方法时才会实际创建Activity。

如果您希望为您的活动提供自定义设置值,您可以在第一次调用getActivity()之前调用setActivityIntent(Intent)和/或setActivityInitialTouchMode(boolean)。活动开始后调用它们将不起作用。

注意:被测试的活动不能从UI线程内开始。如果您的测试方法使用UiThreadTest注释,那么您的Activity将在测试方法运行之前自动启动。您仍然调用此方法以获取待测活动。

0

这正常工作:

public void testGetResourceString() { 
    assertNotNull(mActivity.getResources() 
      .getString(com.example.pkg.R.string.testString)); 
} 

因为你没有提供任何代码,但只有getReousrces()行的,我会想你在做什么错了:你不使用

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