【问题标题】:Android unit testing and interfacesAndroid 单元测试和接口
【发布时间】:2011-04-11 21:41:21
【问题描述】:

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

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

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

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

这似乎是为了进行单元测试而费尽心思。这值得么?有没有更可行的方法?

【问题讨论】:

    标签: android unit-testing


    【解决方案1】:

    事实证明,问题在于必须在实际测试方法中获取活动。因此,例如,我的方法现在看起来像这样:

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

    而在我在设置中创建活动之前。这个赠品在文档中:

    “对于每个测试方法调用,直到第一次调用该方法时才会真正创建Activity。”

    这真的很麻烦。由于同样的原因,HelloWorldTest 的示例不起作用。

    这是完整的条目:

    公共T getActivity() 自:API 3 级 获取正在测试的 Activity,如有必要,请启动它。

    对于每个测试方法调用,直到第一次调用该方法时才会真正创建 Activity。

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

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

    【讨论】:

      【解决方案2】:

      这可以正常工作:

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

      因为您没有提供任何代码,而只提供了 getReousrces() 行,所以我猜您做错了什么:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 2012-11-27
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        相关资源
        最近更新 更多