Guava @VisibleForTesting:帮我一个完整的例子

时间:2014-06-05 04:07:14

标签: java maven unit-testing guava

我的目的是对私有方法进行单元测试,并且我了解如何导入@VisibleForTesting并将其用于私有方法。我做了很多搜索,但无法看到演示此功能的完整示例。

例如:

class MyClass {
    @VisibleForTesting 
    private double[] getWorkArray(double[] values,int length) {
               :
               :
        return <some double array> 
    }
}

现在在JUnit中,我必须能够做到

@Test
public void testProvateMethod() {
    MyClass object = new MyClass();
    assertNotNull(object.getWorkArray(...);
}

但困难的部分是我无法理解/做以下事情 a)maven编译器插件的片段,用于包含相关的注释处理器 b)实际上能够测试私有方法。 (因为它抛出了与方法可见性相关的错误)

我在JUnit中编写测试时无法执行此操作(由于私有访问错误)。例如:mvn clean test

请提供一个完整的示例,说明完成私有方法的JUnit测试所涉及的所有步骤。

3 个答案:

答案 0 :(得分:25)

首先,我建议测试私有方法,单元测试应该在大多数情况下测试公共方法。如果你必须测试私有方法,它通常表示设计不好。

关于@VisibleForTesting,它用在Guava中的package-methods中,而不是JUnit API的一部分。注释只是一个标记,表示可以测试方法,甚至不会在JVM中加载。因此,如果您需要测试非公共方法,使方法包范围对于同一包中的单元测试类是可见的。

最后,通过使用reflect可以访问私有方法,如果你真的需要测试它们。

答案 1 :(得分:2)

测试私有方法必须是错误模式之一。 但是,有时您经常会感受到测试私有方法的冲动。 在这种情况下,我个人使用ReflectionTestUtils来测试该方法。这是因为我们想保留私有方法的原始意图,并且只测试该方法。以下是我的样本示例。

MyClass myClass = new MyClass();

ReflectionTestUtils.invokeMethod(myClass, "getWorkArray", values, length);

一个缺点是,我将方法的名称作为字符串获取,除了重构在IDEA中无法正确转换之外,它有点令人伤心。

我希望它有所帮助。

感谢。

答案 2 :(得分:-3)

您可以删除private关键字:

class MyClass{
      @VisibleForTesting double[] getWorkArray(double[] values,int length) {
                 :
                 :
           return <some double array> 
       }
}

然后你就可以:

MyClass object = new MyClass();
assertNotNull(object.getWorkArray(...);

在你的测试中。