更改方法可访问性以便对其进行测试

时间:2016-02-22 11:36:50

标签: java unit-testing testing tdd

我有一个调用私有方法组的公共方法。

我想用单元测试来测试每个私有方法,因为通过公共方法测试所有内容太复杂了,

认为仅为测试目的而更改方法可访问性是不好的做法。

但我没有看到任何其他方法来测试它(也许是反思,但它很难看)

4 个答案:

答案 0 :(得分:2)

私有方法应该只存在于使用TDD开发的重构公共方法的结果中。

如果使用公共方法创建一个类并计划向其添加私有方法,那么您的体系结构将失败。

我知道它很苛刻,但你所要求的是非常非常糟糕的软件设计。

我建议你买Bob叔叔的书“清洁代码”

http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

这基本上为您提供了一个很好的基础,可以帮助您在开发过程中为您的未来带来很多悲伤。

答案 1 :(得分:2)

IMO只有一个正确的答案;如果班级过于复杂,则意味着它做得太多而且责任太多。您需要将这些职责提取到可以单独测试的其他类中。

所以问题的答案是

你拥有的是代码气味。您已经看到了问题的症状,但是您没有治愈它。您需要做的是使用重构技术,如提取类提取子类。试着看看你是否可以将其中一个私有方法(或其中的一部分)提取到一个类中。然后,您可以将单元测试添加到该新类。划分和征服,直到你控制了代码。

答案 2 :(得分:1)

如上所述,您可以将可见性从私有更改为包,然后确保单元测试位于同一个包中(无论如何通常应该如此)。

对于您的测试问题,这可以是一个可接受的解决方案,因为(现在)私有函数的接口足够稳定,并且您还进行了一些集成测试(即,检查公共方法是否调用私有函数)正确的方法)。

但是,您可能还需要考虑其他一些选项:

  • 如果私有函数是接口稳定但足够复杂的,您可以考虑为它们创建单独的类 - 它们中的一些可能会因为自己被分成几个较小的函数而受益。
  • 如果通过公共接口测试私有函数是不方便的(可能是因为需要复杂的设置),这有时可以通过使用辅助函数来解决,这些函数简化了设置并允许不同的测试共享公共设置代码

答案 3 :(得分:1)

你是对的,改变方法的可见性只是为了让你能够测试它们是一件坏事。以下是您的选择:

通过现有的公共方法对其进行测试。你真的不应该测试方法而是行为,这通常需要多种方法。所以不要再考虑测试该方法,而要弄清楚未经测试的行为。如果你的课程设计得很好,那么它应该很容易测试。

将方法移动到新类中。从设计角度来看,这可能是解决问题的最佳方法。如果您的代码非常复杂,无法访问该私有方法中的所有路径,那么部分代码可能应该存在于自己的类中。在该类中,它们至少具有封装范围并且可以容易地进行测试。再说一遍:你仍然应该测试行为而不是方法。

使用反射。您可以使用反射访问私有字段和方法。虽然这是技术上可行的,但它只是为现有遗留代码添加了更多遗留代码,以隐藏遗留代码。在一般情况下,一个相当愚蠢的事情要做。这有例外。例如,由于某种原因,您不允许对生产源代码进行最小的更改。如果你确实需要这个,请谷歌。

只需更改可见性是的,这是不好的做法。但有时替代方案是:在没有测试的情况下进行大的更改,或者根本不进行测试。所以有时可以咬住子弹并改变能见度。特别是当它是编写一些测试然后在自己的类中提取行为的第一步时。