为了提供一些背景知识,我已经学习 Java 大约 10 个月了,所以我真的没有那么有经验。我最近一直在阅读有关测试私有(private)方法和变量的不良做法的内容。
在完美的世界中,你不应该这样做,因为它表明设计不好 - 然而,我正在使用一个遗留框架,其中大多数方法都是通过反射调用的,这是一个糟糕的设计,但无论如何我都无法改变它。请不要回复说“你应该重新设计你的代码”,因为我无法改变框架的工作方式。
我想测试“流”类是否以某种方式运行并根据私有(private)变量的状态调用正确的方法,并且我想确保某些方法将私有(private)实例变量设置为正确的值,如果另一个私有(private)变量具有一定的值(value)。这样当我将来对类(class)进行更改时,我可以确保类(class)的流程/行为没有中断或改变。</p>
现在,因为流程主要基于私有(private)实例变量的状态,而且测试私有(private)实例变量的状态很糟糕 - 我还能如何测试类?
测试所有工作的私有(private)变量的方法:
在代码末尾实现默认访问 getter 和 setter,并将 junit 测试类放在同一个包中。清楚地注释这些,它们应该仅用于测试。
使实例变量默认访问而不是私有(private),并将 junit 测试类放在同一个包中。无论如何,同一个包中的其他类都不会实例化此类。
通过反射测试私有(private)变量 - 我在这里失去了 IDE 功能,因为如果我更改变量名称,Eclipse 将不会重构,并且手动更改字符串以匹配类中的变量名称可能是 future 的痛苦已测试。
以上三个中哪一个是“较小”的邪恶?测试私有(private)变量然后根本不测试更好吗?
最佳答案
私有(private)字段的状态与类的正确运行无关。您不应该测试私有(private)变量。
测试类做了什么,而不是如何。
如果您想测试该类是否正确设置了它的内部状态,以便它在此之后以特定方式运行,则调用设置状态的方法并测试此后的行为是否正确。
是否需要 1000 次测试来确保这一点并不重要 - 它们只是单元测试,所以它们会很快。
future 的编码人员可以自由更改类的内部工作,只要类的契约得到维护。
关于java - 测试私有(private)变量 - 总是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22731488/