clase pública A { método de vacío público (booleano b) { si (b == verdadero) Método 1(); más método2 (); } método vacío privado1 () {} método vacío privado2 () {} }
clase pública TestA { @Prueba testMethod de vacío público () { A a = simulacro (A.clase); un método (verdadero); // cómo probar como verify (a) .method1 (); } }
¿Cómo probar el método privado se llama o no, y cómo probar el método privado usando mockito?
Respuestas:
No puede hacer eso con Mockito, pero puede usar Powermock para extender Mockito y simular métodos privados. Powermock es compatible con Mockito. He aquí un ejemplo.
fuente
No es posible a través de mockito. De su wiki
fuente
Aquí hay un pequeño ejemplo de cómo hacerlo con powermock.
Para probar el método 1 use el código:
Para establecer el objeto privado obj use esto:
fuente
Piense en esto en términos de comportamiento, no en términos de los métodos que existen. El método llamado
method
tiene un comportamiento particular sib
es verdadero. Tiene un comportamiento diferente sib
es falso. Esto significa que debe escribir dos pruebas diferentes paramethod
; uno para cada caso. Entonces, en lugar de tener tres pruebas orientadas a métodos (una paramethod
, una paramethod1
, una paramethod2
, tiene dos pruebas orientadas al comportamiento.Relacionado con esto (sugerí esto en otro hilo de SO recientemente, y como resultado me llamaron una palabra de cuatro letras, así que siéntase libre de tomar esto con un grano de sal); Encuentro útil elegir nombres de prueba que reflejen el comportamiento que estoy probando, en lugar del nombre del método. Así que no llame a sus pruebas
testMethod()
,testMethod1()
,testMethod2()
y así sucesivamente. Me gustan los nombres comocalculatedPriceIsBasePricePlusTax()
otaxIsExcludedWhenExcludeIsTrue()
que indiquen qué comportamiento estoy probando; luego, dentro de cada método de prueba, pruebe solo el comportamiento indicado. La mayoría de estos comportamientos involucrarán solo una llamada a un método público, pero pueden involucrar muchas llamadas a métodos privados.Espero que esto ayude.
fuente
Si bien Mockito no proporciona esa capacidad, puede lograr el mismo resultado usando Mockito + la clase JUnit ReflectionUtils o la clase Spring ReflectionTestUtils . Vea un ejemplo a continuación tomado de aquí que explica cómo invocar un método privado:
Se pueden encontrar ejemplos completos con ReflectionTestUtils y Mockito en el libro Mockito for Spring
fuente
Se supone que no debes probar métodos privados. Solo se deben probar los métodos no privados, ya que de todos modos deberían llamar a los métodos privados. Si "desea" probar métodos privados, puede indicar que necesita repensar su diseño:
¿Estoy usando la inyección de dependencia adecuada? ¿Es posible que deba mover los métodos privados a una clase separada y probar eso? ¿Deben estos métodos ser privados? ... ¿no pueden ser predeterminados o protegidos?
En el caso anterior, es posible que los dos métodos que se denominan "aleatoriamente" deban colocarse en una clase propia, probarse y luego inyectarse en la clase anterior.
fuente
Pude probar un método privado en el interior usando mockito usando la reflexión. Aquí está el ejemplo, intenté nombrarlo de tal manera que tenga sentido
fuente
Al usar la reflexión, se pueden llamar a métodos privados desde clases de prueba. En este caso,
// el método de prueba será así ...
Si el método privado llama a cualquier otro método privado, entonces debemos espiar el objeto y eliminar el otro método. La clase de prueba será como ...
// el método de prueba será así ...
** El enfoque consiste en combinar la reflexión y el espionaje del objeto. ** método1 y ** método2 son métodos privados y el método1 llama al método2.
fuente
Realmente no entiendo tu necesidad de probar el método privado. La raíz del problema es que su método público ha sido nulo como tipo de retorno y, por lo tanto, no puede probar su método público. Por lo tanto, se ve obligado a probar su método privado. ¿Mi suposición es correcta?
Algunas posibles soluciones (AFAIK):
Burlarse de sus métodos privados, pero aún así no estará probando "realmente" sus métodos.
Verifique el estado del objeto utilizado en el método. LA MAYORÍA de los métodos procesan los valores de entrada y devuelven una salida, o cambian el estado de los objetos. También puede emplearse la prueba de los objetos para el estado deseado.
Refactorice un poco su código (espero que no sea un código heredado). Mi fundamento para escribir un método es que siempre se debe devolver algo (un int / a booleano). El valor devuelto PUEDE o NO PUEDE ser utilizado por la implementación, pero SEGURO SERÁ utilizado por la prueba
código.
fuente
En realidad, hay una forma de probar métodos de un miembro privado con Mockito. Digamos que tienes una clase como esta:
Si desea probar
a.method
se invocará un método desdeSomeOtherClass
, puede escribir algo como a continuación.ReflectionTestUtils.setField();
tropezará al miembro privado con algo que pueda espiar.fuente
Coloque su prueba en el mismo paquete, pero en una carpeta de origen diferente (src / main / java vs src / test / java) y haga que esos métodos sean privados del paquete. La comprobabilidad de la imitación es más importante que la privacidad.
fuente
En los casos en que el método privado no es nulo y el valor de retorno se usa como parámetro para el método de una dependencia externa, puede simular la dependencia y usar un
ArgumentCaptor
para capturar el valor de retorno. Por ejemplo:fuente