在Android中对私有函数进行单元测试

12

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

如果可以,请解释如何做到?

5个回答

9

测试私有方法,对我来说听起来有点不对。公共和受保护的方法是单元测试的候选对象。如果要测试私有方法,您可以将该方法公开或创建更多调用私有方法的公共方法的测试,并测试私有方法的核心功能。


1
我同意rfsk2010的观点。如果你发现通过公共方法测试所有内容太过繁琐,那么这可能是你的类过于庞大且职责过多的代码异味。此时,你可以考虑将代码拆分为只负责单一职责的类。通常情况下,你会发现这些类可重用性更高,而且更容易进行单元测试隔离。 - Scott
1
能够测试内部方法也是很好的。虽然按照契约式编程可以使你正确,但编程也基于分而治之的原则,没有理由不想测试私有或受保护的方法。我投了反对票,因为你给出的理由过于狭隘,没有涵盖开发人员表达的所有需求。 - Snicolas
最好且合适的法律方式来测试测试框架中的私有方法是在该方法上使用@VisibleForTesting注释,这样相同的方法将像公共方法一样对测试框架可见。 - Android is everything for me

2

你好,我发布了一篇关于这个主题的博客文章,并展示了如何通过理解java包和AndroidManifest“包”之间的区别来测试内部方法。

最终你会使用与Java传统方式相同的技巧:将要测试的方法设置为protected。

希望这有所帮助!


您的博客文章中第4点是否仍适用于AGP 3.6.x及以上版本?我已在那里进行了评论。 - mochadwi

2
一年后,我还推出了一个库来帮助测试私有方法和字段。我认为在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。 - Sachchidanand

1

测试框架中测试私有方法的最佳合适的法律方式是在方法上使用@VisibleForTesting注释,这样同一方法将像公共方法一样对测试框架可见。这里是VisibleForTesting注释的官方链接


这看起来是一种更清晰的方法,不改变实际系统以进行测试限制。虽然没有尝试过,但我想知道为什么其他人没有给出这个答案。 - rgv
听起来测试私有方法的方式更加简洁。我会尝试一下。谢谢 :) - Sachchidanand

1

@VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) private String field;

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接