JUnit Testing private variables?
我被分配了单元测试类的任务,我从未直接与JUnit一起工作过,并且严格禁止更改包中的代码。这通常是没有问题的,因为我们的大多数单元测试只是为了功能和输入/输出一致性,这可以通过运行例程并检查它们的返回值来完成。
但是,有时需要检查类中的私有变量,或者直接编辑私有变量以检查某些内部行为。是否有一种方法可以通过JUnit或任何其他方式访问这些代码,以进行单元测试,而不实际更改原始源包中的任何代码?如果不是,程序员如何在现实世界中处理这个问题,在现实世界中,单元测试人员可能与编码人员不是同一个人?
首先,你现在处于一个糟糕的位置——有一个为你最初没有创建并且没有任何更改的代码编写测试的任务——噩梦!与你的老板交谈并解释,如果不让代码"可测试",就不可能测试它。要使代码可测试,通常需要做一些重要的更改;
关于私有变量。实际上你永远不应该这样做。旨在测试私有变量是当前设计出现问题的第一个迹象。私有变量是实现的一部分,测试应该关注行为而不是实现细节。
有时,私有字段会被一些getter公开访问。我这样做,但尽量避免(在注释中标记,如"用于测试")。
因为您不可能更改代码,所以我看不到检查私有变量的可能性(我的意思是真正的可能性,而不是像反射黑客等)。
是的,您可以使用反射来访问私有变量。虽然不是个好主意。
看看这个:
http://en.wikibooks.org/wiki/java_programming/reflection/accessing_private_features_with_reflection
反射例如。:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class PrivateObject { private String privateString = null; public PrivateObject(String privateString) { this.privateString = privateString; } } PrivateObject privateObject = new PrivateObject("The Private Value"); Field privateStringField = PrivateObject.class. getDeclaredField("privateString"); privateStringField.setAccessible(true); String fieldValue = (String) privateStringField.get(privateObject); System.out.println("fieldValue =" + fieldValue); |
尽管有这样的危险:通过单元测试,您希望测试对象的正确行为——这是根据其公共接口定义的。您对对象如何完成此任务不感兴趣-这是一个实现细节,外部看不到。这就是为什么发明OO的原因之一:实现细节是隐藏的。所以测试私有成员是没有意义的。你说你需要100%的保险。如果有一段代码不能通过使用对象的公共接口进行测试,那么这段代码实际上从未被调用,因此不可测试。除去它。
这里有一篇文章可以解决这个问题(特别是涉及测试的问题):
http://onjava.com/pub/a/onjava/2003/11/12/reflection.html
如果在单独的文件夹中创建测试类,然后将其添加到构建路径中,
然后,通过正确使用包设置命名空间,可以使测试类成为被测试类的内部类。这使它可以访问私有字段和方法。
但是不要忘记从发布版本的构建路径中删除文件夹。
我不知道您是否找到了一些特殊的案例代码,这些代码要求您对私有字段进行测试。但根据我的经验,你永远不必测试私人的东西——总是公开的。也许你可以举一个例子来说明你需要测试私有代码的地方?