【问题标题】:Unit test private functions in AndroidAndroid中的单元测试私有函数
【发布时间】:2012-01-12 11:09:29
【问题描述】:

我们可以使用 Android Mock 对 Android 应用程序的私有函数和字段进行单元测试吗?

如果是,请说明如何?

【问题讨论】:

    标签: android unit-testing easymock


    【解决方案1】:

    对私有方法进行单元测试,对我来说听起来有点不对。公共和受保护的方法是单元测试的候选者。只是为了测试私有方法,您可以将方法设为公开或创建更多调用私有方法的公共方法的测试,并测试私有方法的核心功能。

    【讨论】:

    • 我同意 rfsk2010。如果您发现通过公共方法测试所有内容的工作量太大,则可能是代码异味,即您的类太大并且工作太多。此时,您可以考虑将代码分解为具有单一职责的类。通常,您会发现这些类可重用并且更容易隔离单元测试。
    • 很高兴能够测试内部方法。尽管通过契约编程是你的权利,但编程也是基于分而治之的,没有理由不想测试私有或受保护的方法。我投了反对票,因为你给出的理由太有限,并没有解决开发人员表达的所有需求。
    • 从测试框架测试私有方法的最佳和适当的合法方法是在方法上使用@VisibleForTesting 注释,因此相同的方法对于测试框架将是可见的,就像公共方法一样
    【解决方案2】:

    您好,发布了 blog article about this topic,并展示了如何通过了解 java 包和 AndroidManifest“包”之间的区别来测试内部方法。

    您最终将使用与我们在 Java 中传统使用的技巧相同的技巧:让要测试的方法受到保护。

    希望对你有帮助!

    【讨论】:

    • 您博客文章中的第 4 点是否仍然适用于 AGP 3.6.x 及更高版本?我已经评论了
    【解决方案3】:

    一年后,我还推送了一个库来帮助测试私有方法和字段。我相信在 Android 上仍然需要测试私有方法。

    你想让你的活动方法私有,以防止其他类认为他们可以访问它(片段可以,但这对我来说是错误的做法,最好使用可观察观察者模式)。然后,您将得到仅需要通过测试访问的私有字段和方法。

    BoundBox 正是这样做的!下面是一个测试示例,它访问一个活动的 2 个私有字段来测试它:

    @UiThreadTest
    public void testCompute() {
        // given
        boundBoxOfMainActivity = new BoundBoxOfMainActivity(getActivity());
    
        // when
        boundBoxOfMainActivity.boundBox_getButtonMain().performClick();
    
        // then
        assertEquals("42", boundBoxOfMainActivity.boundBox_getTextViewMain().getText());
    }
    

    【讨论】:

    • 谢谢 Snicolas,我去看看 BoundBox
    【解决方案4】:

    从测试框架测试私有方法的最佳和适当的合法方法是 @VisibleForTesting 注释在方法上,因此相同的方法对于测试框架将是可见的,就像公共方法一样。 这里是Official link for VisibleForTesting annotation

    【讨论】:

    • 这看起来是一种更简洁的方法,不会改变实际系统的测试限制。没试过,但想知道为什么没有很多人给出这个答案
    • 听起来更干净的测试私有方法的方法。会试试的。谢谢:)
    【解决方案5】:

    @VisibleForTesting(否则 = VisibleForTesting.PROTECTED) 私有字符串字段;

    您可以在单元测试中使用公共和受保护的字段或方法。

    【讨论】:

      猜你喜欢
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多