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

use*_*525 18 java unit-testing maven guava

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

例如:

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

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

@Test
public void testProvateMethod() {
    MyClass object = new MyClass();
    assertNotNull(object.getWorkArray(...);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

卢声远*_* Lu 28

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

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

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

  • 你的意思是@VisibleForTesting只是出于纪录目的而使用它并没有任何可操作的后果.我希望会有某种注释处理器(也许是编译时间)会让测试发生但不能用于生产. (12认同)
  • 是的,@ OpenForTesting信息只存储在类文件中,但未加载到JVM中. (4认同)

小智 6

测试私有方法肯定是不好的模式之一。然而,有时您经常会感到想要测试私有方法的冲动。在这种情况下,我个人使用ReflectionTestUtils来测试该方法。这是因为我们想保留私有方法的初衷,只测试该方法。下面是我的示例示例。

MyClass myClass = new MyClass();

ReflectionTestUtils.invokeMethod(myClass, "getWorkArray", values, length);
Run Code Online (Sandbox Code Playgroud)

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

我希望它有帮助。

谢谢。