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

我的目的是对私有方法进行unit testing,我理解如何导入@VisibleForTesting并将其用于私有方法。 我做了很多搜索,但无法看到演示此function的完整示例。

例如:

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

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

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

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

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

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

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

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

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

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

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

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

我希望它有所帮助。

谢谢。

您可以删除private关键字:

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

然后你就可以:

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

在你的测试中。