在JUNIT中访问非公共对象方法

时间:2011-11-24 06:20:29

标签: junit

嗨,我是单位测试新手。是否可以访问私有方法?

一个非常简单的例子

ObjectA 
----------

File file;

private void setupFile (){
  //do something
  file = "C:\file.dat"
}

在TestCase中

File sth = ObjectA.setupFile();
assertNotNull(sth);

我无法在方法ObjectA.setup()中测试文件变量是否为null 因为我无法运行ObjectA.setupFile()

我不确定在单元测试方面这样做是否有意义。

更好的做法是编写每个返回某个方法并将它们设置为公开以便于单元测试的方法吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

通常,您应该避免更改方法/字段的访问权限以启用测试。如果您这样做,那么您可能会冒险直接使用该方法。

但是,如果你确实需要,那么就像Deco所说的那样保护它是一种好方法,所以它可以从JUnit测试中访问。如果这样做,请确保已充分记录这是一种供内部使用的方法。

更好的方法是测试公共方法的行为;你不应该关心类的内部实现细节,所以你应该只测试公共方法。从你的代码中很难说,但是假设setupFile()稍后会对其他方法产生影响,所以你可以测试这些效果,而不是文件不为空的事实。

外部依赖项(例如对文件系统的依赖性,环境变量)可以在测试中解决,也可以直接注入到类中。有关一般原则,请参阅我对How to test code dependent on environment variables using JUnit?

的回答

答案 1 :(得分:0)

如果不一定要将方法设置为私有,则可以将其作为包私有(即默认访问),以便可以在JUnit测试中直接调用它。

包私有方法只能在声明它们的包中使用,并且不能成为该类API的一部分。通过在声明上放置no修饰符来声明方法包private。

以下是一个示例:

public class MyClass() {
 int foo;

 public MyClass() {
  this.foo = 0;
 }

 void notSoComplexCalculationMethod(int a) {
  foo = a * 2;
 }
  //Other methods here . . .
}

public class MyClassTest extends TestCase {
  private MyClass myClass;

  protected void setUp() {
    super.setUp();
    myClass = new MyClass();
  }

  public void testNotSoComplexCalculationMethod() {
   int a = 2;

   assertEquals(4, myClass.notSoComplexCalculationMethod(a));
   //Unit test passes, yay! Now you've tested a package private method.
   }
}