JUnittesting私有variables?

我已经被分配了unit testing任务,我从来没有直接与JUnit一起工作,严格禁止更改包中的代码。 这通常是没有问题的,因为我们大多数的unit testing只是为了function和input/输出的一致性,可以通过运行例程和检查它们的返回值来完成。

但是,偶尔需要检查类中的私有variables,或者直接编辑一个私有variables来检查一些内部行为。 有没有一种方法可以通过JUnit或其他任何方式访问这些文件,以便进行unit testing,而无需实际更改原始源代码包中的任何代码? 如果不是,程序员在现实世界中如何处理这个问题,那么unit testing人员可能与编码人员不一样?

是的,你可以使用reflection来访问私有variables。 虽然不是一个好主意。

看一下这个:

http://en.wikibooks.org/wiki/Java_Programming/Reflection/Accessing_Private_Features_with_Reflection

首先,你现在处于一个不好的位置 – 有一个任务,为你最初没有创build的代码编写testing,没有任何改变 – 噩梦! 和你的老板交谈,解释一下,如果不进行testing,就不可能testing代码。为了使代码可testing,你通常会做一些重要的改变;

关于私有variables。 你实际上永远不应该这样做。目的是testing私有variables是第一个信号,现在devise出现问题。 私有variables是实现的一部分,testing应该关注行为而不是实现细节。

有时,私人领域正在打开一些getter ..我这样做,尽量避免(标记在评论中,如'用于testing')。

既然你没有可能改变代码,我没有看到可能性(我的意思是真正的可能性,不像reflection黑客等)来检查私有variables。

反思例如:

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); 

这里有一篇文章解决了这个问题(具体包括testing):

http://onjava.com/pub/a/onjava/2003/11/12/reflection.html

尽pipe存在明显的危险:使用unit testing,您要testing对象的正确行为 – 这是用公共接口来定义的。 你对这个对象是如何完成这个任务并不感兴趣 – 这是一个实现细节,并且不可见。 这是OO被发明的原因之一:实现的细节是隐藏的。 所以testing私人会员没有意义。 你说你需要100%的覆盖率。 如果有一段代码不能通过对象的公共接口进行testing,那么这段代码实际上从来不会被调用,因此不可testing。 去掉它。

我不能告诉你是否已经find了一些特殊情况下的代码,要求你对私人领域进行testing。 但是根据我的经验,你永远不需要testing一些私密的东西 – 永远是公开的 也许你可以举一些你需要testing私有代码的例子吗?

如果您在单独的文件夹中创buildtesting类,然后将其添加到构buildpath中,

然后通过正确使用包来设置命名空间,可以使testing类成为被testing类的内部类。 这使得它可以访问私人领域和方法。

但不要忘记从您的发布构build的构buildpath中删除该文件夹。