添加' Getters'和'塞特斯'为了单元测试?

时间:2014-03-28 20:48:45

标签: java unit-testing testing junit mockito

我目前正在使用一些漂亮的iffy代码。代码本身不是遗留的,但它使用的框架是遗留的并且非常糟糕。

我想开始为一个类编写一些junit测试(用于更改!)但为了有效地执行此操作,我需要添加一些getter和setter。

我需要setter所以我可以检查类中私有变量的状态(这里是一种状态机设计模式),我需要getter来模拟某些方法中的私有变量。

为了能够编写单元测试,你们会说为了一个类添加getter和setter是坏的,好的还是简单的可接受的?

3 个答案:

答案 0 :(得分:9)

我会避免它。一般来说,您应该尽可能地构建事物,以避免需要测试私有变量并坚持应用程序的其余部分将要接触的交互。这通常是使用伪造/双打的公共方法/属性和受保护的方法。

单元测试的目的是验证被测对象如何与之交互,而不一定是它的实现细节。基本上,输入x,我应该得到输出/效果y。如果你准备好测试x产生y的确切方式,那么你就有可能让你的类变得不灵活。即使输出和最终结果相同,您班级的每个重构都可能会破坏您的测试。

答案 1 :(得分:4)

仅为单元测试添加代码到生产代码是我试图避免的。

您的案例的另一种选择是通过反射检索值,因为甚至可以访问私有成员。

Field field = object.getClass().getDeclaredField("member");
field.setAccessible(true);
Object value = field.get(object);

答案 2 :(得分:2)

我更喜欢将所有依赖项传递给构造函数,但假设添加到现有系统太难了,只需确保getter和setter是包私有的,并清楚地标记它们(注释或javadoc)它们纯粹是可见的用于检测。如果您可以添加一些静态分析工具以确保仅从测试中不从生产代码调用getter和setter,那就更好了。