es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PowerMockito verifyTimes siempre pasa los métodos privados.

public class TestedClass {

    public void publicMethod() {
        privateMethod();
    }

    private void privateMethod() {
    }
}

Me gustaría probar con PowerMockito que el método privado se llame exactamente una vez.

Aquí está mi clase de prueba:

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
public class TestedClassTest {

    @Before
    public void setUp() {
    }

    @Test
    public void testPrivateMethodCalledOnce() throws Exception {
        TestedClass spy = PowerMockito.spy(new TestedClass());
        spy.publicMethod();

        PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke("privateMethod"); 
    }
}

A pesar de ser llamado solo una vez, esta prueba pasa. Incluso si comento privateMethod dentro del método público, la prueba todavía pasa.

public class TestedClass {

    public void publicMethod() {
        //privateMethod(); <-- la prueba aún pasa
    }

    private void privateMethod() {
    }
}

¿Alguien tiene idea de qué hice mal? ¿Y alguien sabe cómo verificar que el método privado se haya llamado exactamente una vez en la prueba unitaria?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que hay un error en el código de verificación en el método testPrivateMethodCalledOnce(). El método times() en Mockito.times(772) debería cambiarse por Mockito.times(1) para verificar que el método privado se haya llamado exactamente una vez.

    Por lo tanto, el código actualizado para el método testPrivateMethodCalledOnce() debe ser:

    @Test
    public void testPrivateMethodCalledOnce() throws Exception 
    {
        TestedClass spy = PowerMockito.spy(new TestedClass());
        spy.publicMethod();
    
        PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke("privateMethod"); 
    }
    

    Con este cambio, la prueba fallará si privateMethod() no se llama exactamente una vez, incluso si está comentado en publicMethod().

Comments are closed.