在单元测试中访问私有静态最终值的最佳实践

时间:2014-06-27 15:56:13

标签: java unit-testing encapsulation

如果单元测试(在单独的包中)需要来自类的私有静态最终值X,那么应如何获取X?我可以想到三个选项,其中没有一个看起来很干净:

1)将X复制到测试类中。我担心如果更改了源X的X,而保留了测试的X,那么单元测试在失败时仍会通过。

2)公开X.我担心这打破了封装。尽管如此,鉴于X是最终的,我认为这是最好的选择。

3)为X创建一个公共getter。如果只能从类和单元测试中访问X,这似乎也打破了封装。

3 个答案:

答案 0 :(得分:9)

我会说你不需要访问它。如果某些内容是私有的,那么它将用作实现细节,并且应该对测试不可见。您应该测试类的要求,而不是实现细节。你为什么问?因为随着时间的推移,植入可能会改变(或进化),而要求应该是一致的。

答案 1 :(得分:1)

我会选择你的第三个选项。

我将在测试类中创建一个私有静态final变量,并使用getter分配它,获取所需的私有静态最终值的值。这样,您在测试类中的值将具有与原始值类似的属性。

我希望这会有所帮助。

答案 2 :(得分:0)

您始终可以通过反射访问您的私人方法和字段。

Field X = MyClass.class.Getdeclaredfield("X");

然后,当您的字段为静态时,您可以使用getXX类的Field方法之一获取其值。例如:

Object o = X.get(null);