java maven unit-testing guava

java - Guava @VisibleForTesting: Ayúdame con un ejemplo completo



maven unit-testing (3)

Mi intención es hacer una prueba unitaria de métodos privados y entiendo cómo importar el @VisibleForTesting y usarlo para un método privado. He hecho un poco de búsqueda pero no puedo ver un ejemplo completo que demuestre esta característica.

Por ejemplo:

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

Ahora en JUnit, debo ser capaz de hacer

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

Pero la parte difícil es que no puedo comprender / hacer lo siguiente a) Fragmento del complemento compilador de Maven para incluir el procesador de anotaciones relevante b) En realidad, se puede probar un método privado. (ya que arroja un error relacionado con la visibilidad del método)

No puedo hacerlo en acción mientras escribo una prueba en JUnit (debido al error de acceso privado). Por ejemplo: mvn clean test

Por favor, proporcione un ejemplo completo para realmente todos los pasos involucrados en la realización de la prueba JUnit de métodos privados.


En primer lugar, no recomiendo probar métodos privados, las pruebas unitarias deberían probar métodos públicos en la mayoría de los casos. Si tiene que probar métodos privados, generalmente indica un mal diseño.

Con respecto a @VisibleForTesting , se usa en métodos de paquete en Guava, y no es parte de la API de JUnit. La anotación es solo una etiqueta para indicar que el método se puede probar, incluso no se carga en JVM. Entonces, si necesita probar métodos no públicos, haga que el alcance del paquete de métodos sea ​​visible para las clases de prueba unitaria en el mismo paquete.

Por último, al utilizar reflect puede acceder a métodos privados, si realmente tiene que probarlos.


Probar un método privado debe ser uno de los patrones malos. Sin embargo, hay ocasiones en que a menudo sientes la necesidad de probar métodos privados. En este caso, yo personalmente uso ReflectionTestUtils para probar el método. Esto se debe a que queríamos mantener la intención original del método privado y solo probar el método. A continuación se muestra un ejemplo de mi muestra.

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

Una desventaja es el hecho de que recibo el nombre del método como una cadena y es bastante triste, excepto por el hecho de que la refactorización no se convierte correctamente en IDEA.

Espero que ayude.

Gracias.


Puede eliminar private palabra clave private :

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

Entonces eres capaz de:

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

en tu prueba