有一次问同事:除了用JAVA Reflection 来测试私有方法外,还有什么好的方法可以更简单的测试私有方法。
同事回答,可以用Guava的VisibleForTesting。于是看了看这个注释的用法。
这个注释的接口定义如下:
@GwtCompatible
public @interface VisibleForTesting
Annotates a program element that exists, or is more widely visible than otherwise necessary, only for use in test code.
从字面上可以被这样理解: 注释一个已经存在的程序元素或者所注释的元素被给于它所必须的更宽松的 可见性,仅仅被使用在测试代码中。
我们通过一个测试私有方法的例子来看看这个注释的使用:
1 public class PrivateData { 2 @VisibleForTesting 3 /*private*/ void testPrivate(int pr){ 4 System.out.print(pr); 5 } 6 }
下面是测试类:
1 public class PrivateDataTest { 2 @Test 3 public void testPrivate() throws Exception { 4 PrivateData pm = new PrivateData(); 5 pm.testPrivate(1); 6 } 7 8 }
通过上面的代码看出, 被测试的testPrivate方法的可见性还是被改成Protected。也就是,VisibleForTesting只是一个注释,一个元数据metadata,它并没有进入程序逻辑,也没有被转化成字节码byte code 从而被JVM执行。
笔者猜测可能是Guava 的 程序员犯懒了, 即不愿意在unit test里直接利用Reflection来测试私有方法。也没有把私有方法写入另一个类中。所以设计了VisibleForTesting的注解来提醒其他程序员: 这里为了测试私有方法把私有方法改成了Protected(受保护的)并放宽了访问限制。
可是就JAVA本身而言,只有通过Reflection才能真正测试私有方法。