java - 测试私有(private)变量 - 总是不好的做法?

标签 java unit-testing junit mockito private-members

为了提供一些背景知识,我已经学习 Java 大约 10 个月了,所以我真的没有那么有经验。我最近一直在阅读有关测试私有(private)方法和变量的不良做法的内容。

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

我想测试“流”类是否以某种方式运行并根据私有(private)变量的状态调用正确的方法,并且我想确保某些方法将私有(private)实例变量设置为正确的值,如果另一个私有(private)变量具有一定的值(value)。这样当我将来对类(class)进行更改时,我可以确保类(class)的流程/行为没有中断或改变。<​​/p>

现在,因为流程主要基于私有(private)实例变量的状态,而且测试私有(private)实例变量的状态很糟糕 - 我还能如何测试类?

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

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

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

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

以上三个中哪一个是“较小”的邪恶?测试私有(private)变量然后根本不测试更好吗?

最佳答案

私有(private)字段的状态与类的正确运行无关。您不应该测试私有(private)变量。

测试类做了什么,而不是如何

如果您想测试该类是否正确设置了它的内部状态,以便它在此之后以特定方式运行,则调用设置状态的方法并测试此后的行为是否正确。

是否需要 1000 次测试来确保这一点并不重要 - 它们只是单元测试,所以它们会很快。

future 的编码人员可以自由更改类的内部工作,只要类的契约得到维护。

关于java - 测试私有(private)变量 - 总是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22731488/

相关文章:

java - EasyMock 缺少行为,即使它已定义

java - 更新项目而不修改有效期

java - 如何在 Java 中引用封闭的匿名类实例?

java - Maven,带有 OS X 的 JAVA_HOME

Django 在运行测试时不创建测试数据库

java - 总的单元测试执行时间消失了

java - 如何使用netty写一个http代理

typescript - 在每个 Jest 测试中模拟不同的 TypeScript 常量

java - 如何在 JUnit 4 中动态添加测试到测试套件?

java - 用于由 boolean 标志驱动的 Java 方法的 Junit