测试私有变量 - 总是不好的做法?

时间:2014-03-29 13:08:07

标签: java unit-testing junit mockito private-members

为了给一些背景,我已经学习了大约10个月的java,所以我真的没那么有经验。我最近读过一些关于如何测试私有方法和变量的错误做法。

在完美的世界中,你不应该这样做,因为它暗示了糟糕的设计 - 但是,我正在使用遗留框架,其中大多数方法都是通过反射来调用的,这是糟糕的设计,但无论如何我都无法改变它。请不要回复说“你应该重新设计代码”,因为我无法改变框架的工作方式。

我想测试'flow'类以某种方式运行并根据私有变量的状态调用正确的方法,并且我想确保某些方法将私有实例变量设置为正确的值,如果另一个私有变量具有一定的价值。当我将来对类进行更改时,我可以确保类的流/行为没有被破坏或更改。

现在,因为流程主要基于私有实例变量的状态,并且因为测试私有实例变量的状态不好 - 我怎么测试类?

测试所有工作的私有变量的方法:

  1. 在代码末尾实现默认访问getter和setter,并将junit测试类放在同一个包中。清楚地评论它们应该只用于测试。

  2. 将实例变量设为默认访问而非私有,并将junit测试类放在同一个包中。无论如何,同一个包中的其他类都不会实例化此类。

  3. 通过反射测试私有变量 - 我失去了IDE功能,因为如果我更改变量名称Eclipse将不会重构,并且可能是将来手动更改字符串以匹配类中的变量名称的痛苦测试

  4. 上述三个中哪一个是“较小”的邪恶使用?是否更好地测试私有变量然后根本没有测试?

2 个答案:

答案 0 :(得分:7)

私人领域的状态与班级的正确运作无关。你不应该测试私有变量。

测试所做的类,而不是 它是怎么做的。

如果要测试类是否正确设置其内部状态,那么它在此之后以特定方式运行,然后调用设置状态的方法并测试之后的行为是否正确。

如果需要1000次测试才能确保 - 它们只是单元测试,所以它们会很快。

只要维持班级合同,未来的程序员可以自由改变班级的内部运作。

答案 1 :(得分:0)

第一个选择对你来说是个不错的选择。 在遵循良好的编码实践的同时,我们应该始终将变量设为私有变量,将变量设置为公共变量,以便变量无法修改,外部世界可以访问方法。