番石榴@VisibleForTesting:用一个完整的例子帮助我

2022-09-01 15:44:42

我的目的是对私有方法进行单元测试,我了解如何导入私有方法并将其用于私有方法。我已经做了相当多的搜索,但无法看到演示此功能的完整示例。@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 测试所涉及的所有步骤。


答案 1

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

关于 ,它用于番石榴的包方法,而不是 JUnit API 的一部分。注释只是一个标记,用于指示可以测试该方法,它甚至不会在JVM中加载。因此,如果需要测试非公共方法,请使方法包作用域对同一包中的单元测试类可见。@VisibleForTesting

最后,通过使用反射可以访问私有方法,如果您确实必须测试它们。


答案 2

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

MyClass myClass = new MyClass();

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

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

我希望它有帮助。

谢谢。


推荐