Cómo simular métodos void en Mockito: guía para principiantes con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿por qué los métodos void son un dolor de cabeza para los principiantes?

\n\n

¿Alguna vez has escrito una prueba unitaria en Java con Mockito y de repente te has topado con un muro? Todo parece sencillo: simulas un objeto, configuras el comportamiento para métodos que devuelven algo (una cadena, un número, una lista). Pero cuando llegas a los métodos void —aquellos que no devuelven nada, solo hacen algo internamente (por ejemplo, guardar datos, enviar un correo, registrar una acción)— empieza el bloqueo.

\n\n

¿Por qué? Porque el habitual when(mock.someMethod()).thenReturn(something) no funciona aquí. El compilador simplemente no te dejará escribir when(mock.voidMethod()).thenReturn(...) — el método void no devuelve nada, y thenReturn no tiene sentido aquí.

\n\n

Precisamente esta pregunta — "How to mock void methods with Mockito" — ha acumulado miles de visitas en Stack Overflow. Y hoy la resolveremos de una vez por todas. Aprenderás no solo a simular métodos void, sino a hacerlo correctamente, de forma limpia y sin dolor.

\n\n

¡Allá vamos! 🚀

\n\n

¿Qué es un método void desde el punto de vista de las pruebas?

\n\n

Un método void es un método que realiza una acción, pero no devuelve un resultado. Por ejemplo:

\n\n
public class EmailService {\n    public void sendWelcomeEmail(String email) {\n        // aquí el envío real del correo\n        System.out.println("Enviando correo a " + email);\n    }\n}
\n\n

En un proyecto real, no queremos que cada vez que se ejecute la prueba se envíe realmente un correo. Solo necesitamos verificar que el método fue llamado, o silenciar su ejecución, o hacer que lance una excepción (para probar el manejo de errores).

\n\n

Para esto, Mockito proporciona una sintaxis especial usando doNothing(), doThrow(), doAnswer() y doCallRealMethod().

\n\n

1. El caso más común: doNothing() — simplemente silenciar un método void

\n\n

Si necesitas que un método void no haga nada al ser llamado — usa doNothing(). Este es el comportamiento predeterminado de Mockito para métodos void, pero a veces es útil indicarlo explícitamente (por ejemplo, para legibilidad o al usar spy).

\n\n
import org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.Mock;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\nimport static org.mockito.Mockito.*;\n\n@ExtendWith(MockitoExtension.class)\npublic class EmailServiceTest {\n\n    @Mock\n    private EmailService emailService;\n\n    @Test\n    void testDoNothing() {\n        // Configuramos: al llamar a sendWelcomeEmail no hacer nada\n        doNothing().when(emailService).sendWelcomeEmail(anyString());\n\n        // Llamamos al método\n        emailService.sendWelcomeEmail("test@example.com");\n\n        // Verificamos que el método fue efectivamente llamado\n        verify(emailService).sendWelcomeEmail("test@example.com");\n    }\n}
\n\n

Importante: Si usas @Mock, no es necesario escribir doNothing() — Mockito por defecto convierte los métodos void en "vacíos". Pero si usas @Spy (espía), se llamará al método real, y doNothing() es necesario para evitarlo.

\n\n

2. doThrow() — simulamos un error en un método void

\n\n

Una tarea muy común: verificar cómo reacciona tu código si el servicio de envío de correos falla con un error. Para esto, hacemos que el método void lance una excepción.

\n\n
@Test\nvoid testDoThrow() {\n    // Configuramos: al llamar a sendWelcomeEmail lanzar RuntimeException\n    doThrow(new RuntimeException("Error al enviar el correo"))\n            .when(emailService).sendWelcomeEmail(anyString());\n\n    // Ahora al llamar al método se lanzará una excepción\n    assertThrows(RuntimeException.class, () -> {\n        emailService.sendWelcomeEmail("fail@example.com");\n    });\n\n                

Blogs

Book Recommendations