2012-04-13 14 views
8

¿Es una buena idea cambiar los métodos privados a protegidos para las pruebas JUNIT?Cambiar los métodos privados a protegidos para probar

+0

¿Por qué debería? ¿Cambias algo antes de la prueba, no puedo ver NINGUNA razón para ello? – Nanne

+2

Casi ciertamente no es una buena idea; Si está probando directamente los métodos internos de una clase, debería considerar refaccionarlos en una clase separada. –

+0

Lo he hecho en casos en que un método privado devuelve algún recurso que no está disponible en el entorno de prueba de la unidad, y quiero probar algún otro método (no privado) que lo llame. Al protegerlo, puedo anularlo, de modo que devuelva un stub/mock en lugar del recurso no disponible. Esto ha significado que una prueba unitaria se vuelve factible y no he podido encontrar otra forma de evitar esto, pero es menos que ideal. –

Respuesta

9

A veces es útil, sí.

Si la clase es extensible, asegúrese de que el método sea definitivo.

Además, documente el hecho de que no se supone que el método sea llamado por subclases o clases externas del mismo paquete.

Utilizo la anotación Guava @VisibleForTesting para dejar en claro que el método debe ser privado.

+0

Gracias por abrir mis ojos a @VisibleForTesting. No sabía que esto existía. Sigue sintiendo que esto es un poco imperfecto ya que afecta la sintaxis de la implementación solo con el propósito de probar, pero es mejor que exponer a los miembros y métodos que deberían ser privados. Y limitar las pruebas a los métodos de interfaz parece una restricción demasiado estricta y a veces poco práctica. – Lolo

4

Puede hacer que el paquete de métodos sea local.

Puede llamar al método privado mediante reflexión, o puede decidir que los métodos private no se deben probar directamente, solo indirectamente.

5

No, en general, no. La idea de la prueba unitaria es probar ... unidades. O en otras palabras, implementaciones de métodos de interfaz. Si desea probar un método que no puede "ver", podría ser un olor a código. Tal vez no haya separado su lógica comercial lo suficiente del código UI o algo así.

Así que la mejor idea sería reconsiderar su arquitectura. Pero si la alternativa sería no probar tu código, es una buena idea proteger esos métodos.

1

Aunque debería preferir refactorizar como se sugirió @ user714965, MockPrivate de PowerMock puede hacer la burla sin abrir la visibilidad de sus métodos privados.

Escribir sus pruebas primero generalmente conduce a un diseño donde no necesita burlarse de métodos privados.

Cuestiones relacionadas