两个公共方法调用私有方法

时间:2013-05-17 11:12:32

标签: unit-testing testing junit

我听说有人说通过公共方法为私有方法编写Junit测试更好。但在这种情况下,我应该测试私有方法以避免重复的代码。这是好方法吗?

2 个答案:

答案 0 :(得分:1)

这是主观品味的混合,我选择的最佳实践和直觉。

对于单元测试,我不介意直接调用私有函数,如果你通过单元测试意味着测试一个特定的函数,而不是别的。我不介意,因为它减少了包装代码,而且与生产代码相比,功能使用模式可能相当不寻常。

如果测试不止于此,整个类或一系列函数,我更喜欢只使用公共方法,因为其他代码将使用它。

答案 1 :(得分:0)

所以,是的,您可以并且很多人通过这种方式测试通常为private的方法。通常,该方法更改为默认范围,我建议添加@VisibleForTesting提供的Guava注释。

这种方法的问题在于它不允许重构(或限制)被测试代码的重构能力。一个好的单元测试允许整个被测试的类被完全重构(同时保持相同的API),而不会使测试失败。

所以这里有一个平衡点。由于public方法对private方法中发生的事情都有相同的要求,因此优良做法是为每种公共方法充分运用这组要求。

我的建议(依赖于private方法的复杂性)是在测试中创建一个实用程序方法来配置私有方法(将其设置为以特定方式运行)并使用此方法在公共方法的测试中。对验证方法执行相同操作。

另一种选择是创建测试private方法功能的测试,并传入反射Method作为入口点。这将允许您通过两种公共方法测试所有功能,而无需重复代码。