sencilla programa poo metodos hechos dibujos con codigo clases clase calculadora java unit-testing mocking mockito

programa - metodos en java



simulacro de métodos en la misma clase (3)

El primer problema es que debe usar el objeto spyTest para esperar algo de Mockito. Aquí no es lo mismo que prueba. spyTemp está envuelto por la temperatura del objeto Mockito.

Otro problema es que solo methodB() , pero trata de ejecutar methodA() . Sí, en su implementación de methodA() llama al método B (), pero llama a this.methodB() , no como spyTemp.methodB() . Aquí tienes que entender que el burlarse funcionaría solo cuando lo llames en la instancia de temp . Está envuelto por el proxy de Mockito que capta su llamada y si ha reemplazado algún método llamaría a su nueva implementación en lugar de original. Pero desde que se llamó al método original, dentro de él no se sabe nada sobre el proxy de Mockito. Por lo tanto, su método "overriden" se spyTemp.methodB() solo cuando ejecute spyTemp.methodB()

Esto debería funcionar:

Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); boolean status = spyTemp.methodB("XYZ");

Estoy usando Mockito para burlarme de un método en la misma clase para la que estoy escribiendo una prueba. He visto otras respuestas en SO ( Método de burla en la misma clase ), pero probablemente las estoy malinterpretando, ya que tengo problemas.

class Temp() { public boolean methodA(String param) { try { if(methodB(param)) return true; return false; } catch (Exception e) { e.printStackTrace(); } } }

Mi método de prueba:

@Test public void testMethodA() { Temp temp = new Temp(); Temp spyTemp = Mockito.spy(temp); Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); boolean status = temp.methodA("XYZ"); Assert.assertEquals(true, status); }

Sin embargo, imprimo la expection porque se ejecuta la definición de methodB. Mi comprensión es que la definición del método B se burlaría del uso de spyTemp. Sin embargo, ese no parece ser el caso.

¿Puede alguien explicar por favor dónde estoy yendo mal?


Tenga en cuenta lo siguiente de la documentación de Mockito:

Mockito no delega llamadas a la instancia real pasada, sino que crea una copia de la misma. Por lo tanto, si conserva la instancia real e interactúa con ella, no espere que el espía tenga conocimiento de esa interacción y su efecto en el estado real de la instancia. El corolario es que cuando se invoca un método no anclado en el espía pero no en la instancia real , no verá ningún efecto en la instancia real.

Esto se refiere específicamente a su situación. Mantiene una referencia a la temp y luego llama a su methodA Mockito no está espiando en esa instancia en absoluto; está espiando spyTemp . Entonces se llama el methodB .

Tenga en cuenta que debe evitar simulaciones parciales para el nuevo código.


Usted creó un methodB() espía y methodB() . ¡Eso es correcto! Pero llamó methodA() en el objeto original. Para obtener el resultado correcto, llámalo al espía

boolean status = spyTemp.methodA("XYZ");