JUnit测试私有变量?

don*_*ton 64 java variables junit unit-testing private

我被分配了一个单元测试任务的任务,我从未直接用JUnit工作,并且严格禁止更改包中的代码.这通常没有问题,因为我们的大多数单元测试只是为了功能和输入/输出的一致性,这可以通过运行例程并检查它们的返回值来完成.

但是,偶尔需要检查类中的私有变量,或者直接编辑私有变量以检查某些内部行为.有没有办法获得访问这些,无论是通过JUnit或任何其他方式,为了单元测试而不实际更改原始源包中的任何代码?如果没有,那么程序员如何在现实世界中处理这个问题,而单元测试人员可能与编码器不同?

Ale*_*sky 51

首先,你现在处于一个不好的位置 - 负责为你最初没有创建的代码编写测试,没有任何改变 - 噩梦!与老板交谈并解释,如果不使其"可测试",就无法测试代码.为了使代码可测试,您通常会做一些重要的更改;

关于私人变量.你实际上永远不应该这样做.旨在测试私有变量是当前设计出现问题的第一个迹象.私有变量是实现的一部分,测试应该关注行为而不是实现细节.

有时候,私人领域会受到一些吸气者的公共访问.我这样做,但尽量避免(在评论中标记,如'用于测试').

由于你没有可能改变代码,我没有看到检查私有变量的可能性(我的意思是真实的可能性,而不是像反射黑客等).

  • @Kwebble我的经验表明,分离"编码员"和"测试者"是一种非常糟糕的做法.) (4认同)
  • 拥有独立的代码和测试开发人员可能是一个优势,因为它需要2个人来解释规范.如果他们的解释不同,要求不够清楚,测试可能会失败并且您已检测到可能的错误.大! (2认同)

Alf*_*rio 29

是的,你可以使用反射来访问私有变量.尽管不是个好主意.

看一下这个:

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

  • would be good if you elaborate why is not good idea but you still proposed it.. (9认同)

bpg*_*rgo 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);
Run Code Online (Sandbox Code Playgroud)