Verificación de interacciones con mocks
Aprenda a verificar que los objetos simulados se hayan invocado con los argumentos esperados y un número específico de veces.
Verificación de interacciones con mocks es una lección gratuita de Testing Mastery: JUnit, Mockito & Integration Tests en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Testing Mastery: JUnit, Mockito & Integration Tests, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Testing Mastery: JUnit, Mockito & Integration Tests incluye 4 lecciones en total.
Partes de esta lección aún no han sido traducidas y se muestran en inglés.
Intro to Mockito Verification
Welcome to verifying mock interactions! After learning to create mocks, the next crucial step is to confirm how they were used.
Verification in Mockito means checking if specific methods on your mock objects were called during a test.
Why Verify Interactions?
When testing a class, you often want to ensure it correctly interacts with its dependencies.
- Collaboration Check: Did the object under test call the right methods on its collaborators?
- Behavior Confirmation: Did it pass the correct arguments to those methods?
- Interaction Count: Was a method called once, multiple times, or not at all?
Verification answers these questions, ensuring your code behaves as expected.
The Basic `verify()` Method
The simplest way to verify an interaction is using Mockito.verify(). It checks if a method was called exactly once.
You write verify(mockObject).methodCall(); after the code under test has run. If the method wasn't called, or was called more than once, Mockito will throw an error.
Code: Basic `verify()` in Action
Try this runnable example. We'll simulate a test by creating a mock and calling a method on it. Then, we verify the interaction.
In a real JUnit test, a failed verification would make the test fail.
import static org.mockito.Mockito.*;
interface MyService {
void doSomething();
}
class MyProcessor {
private MyService service;
public MyProcessor(MyService service) {
this.service = service;
}
public void execute() {
service.doSomething();
}
}
public class Main {
public static void main(String[] args) {
MyService mockService = mock(MyService.class);
MyProcessor processor = new MyProcessor(mockService);
System.out.println("Calling execute...");
processor.execute(); // This calls mockService.doSomething()
try {
// Verify doSomething() was called exactly once
verify(mockService).doSomething();
System.out.println("\nVerification successful: doSomething() called once.");
} catch (Throwable e) {
System.out.println("\nVerification failed: " + e.getMessage());
}
System.out.println("Program finished.");
}
}Verifying Specific Arguments with `eq()`
Often, you need to check not just if a method was called, but with what arguments.
Use eq(value) to match an exact argument value. For example, verify(mock).someMethod(eq("hello"), eq(123)); ensures the method was called with "hello" and 123.
You can also use generic matchers like anyString() or anyInt() if you don't care about a specific argument's value.
Code: `verify()` with `eq()`
Here, we verify that a message was sent with specific content and priority. Notice how eq() helps us be precise.
import static org.mockito.Mockito.*;
interface DataSender {
void send(String message, int priority);
}
class MessageProcessor {
private DataSender sender;
public MessageProcessor(DataSender sender) {
this.sender = sender;
}
public void processAndSend(String data) {
sender.send(data.toUpperCase(), 1);
}
}
public class Main {
public static void main(String[] args) {
DataSender mockSender = mock(DataSender.class);
MessageProcessor processor = new MessageProcessor(mockSender);
System.out.println("Processing 'hello' message...");
processor.processAndSend("hello");
try {
// Verify send() was called with "HELLO" and 1
verify(mockSender).send(eq("HELLO"), eq(1));
System.out.println("\nVerification successful: Correct arguments received.");
} catch (Throwable e) {
System.out.println("\nVerification failed: " + e.getMessage());
}
// The following commented block shows a failing verification
// try {
// verify(mockSender).send(eq("hello"), eq(1)); // "hello" (lowercase) is wrong
// System.out.println("This should not be printed.");
// } catch (Throwable e) {
// System.out.println("Expected failure for wrong arguments: " + e.getMessage());
// }
System.out.println("Program finished.");
}
}Verifying Call Counts: `times()` & `never()`
Sometimes, you need to verify how many times a method was called:
verify(mock, times(N)).method();: Called exactly N times.verify(mock, never()).method();: Never called (same astimes(0)).
These are powerful for ensuring loops, conditions, or error handling work correctly.
Code: `times()` and `never()`
This example processes multiple events and logs an error. We'll verify the exact number of times each type of log was made.
import static org.mockito.Mockito.*;
interface EventLogger {
void log(String event);
}
class EventProcessor {
private EventLogger logger;
public EventProcessor(EventLogger logger) {
this.logger = logger;
}
public void processEvents(int count) {
for (int i = 0; i < count; i++) {
logger.log("Event " + (i + 1));
}
}
public void logError(String error) {
logger.log("ERROR: " + error);
}
}
public class Main {
public static void main(String[] args) {
EventLogger mockLogger = mock(EventLogger.class);
EventProcessor processor = new EventProcessor(mockLogger);
System.out.println("Processing 3 events and logging an error...");
processor.processEvents(3);
processor.logError("Failed to connect");
try {
// Verify log() was called 3 times with arguments starting with "Event "
verify(mockLogger, times(3)).log(startsWith("Event "));
System.out.println("\nVerification successful: 'Event' logged 3 times.");
// Verify log() was called once with the exact error message
verify(mockLogger, times(1)).log(eq("ERROR: Failed to connect"));
System.out.println("Verification successful: Error logged once.");
// Verify log() was never called with arguments starting with "WARNING"
verify(mockLogger, never()).log(startsWith("WARNING"));
System.out.println("Verification successful: 'WARNING' never logged.");
} catch (Throwable e) {
System.out.println("\nVerification failed: " + e.getMessage());
}
System.out.println("Program finished.");
}
}Flexible Call Counts: `atLeast()`, `atMost()`
Sometimes an exact count isn't necessary, but a range is important:
verify(mock, atLeast(N)).method();: Called N or more times.verify(mock, atMost(N)).method();: Called N or fewer times.
There are also convenient shortcuts: atLeastOnce() and atMostOnce() for clarity.
Verify Interactions Check
Which of the following are valid ways to verify method calls using Mockito?
Recap: Mastering Verification
You've learned how to verify mock interactions in Mockito!
verify(mock).method();checks for a single call.- Use
eq()for exact argument matching or generic matchers likeanyString(). - Control call counts with
times(N),never(),atLeast(N), andatMost(N).
Mastering verification is key to writing robust, reliable unit tests that confirm precise object collaboration.
Preguntas frecuentes
¿La lección «Verificación de interacciones con mocks» es gratis?
Sí — el texto completo de «Verificación de interacciones con mocks» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Testing Mastery: JUnit, Mockito & Integration Tests, actualiza a CoddyKit PRO. El curso de Testing Mastery: JUnit, Mockito & Integration Tests incluye 4 lecciones en total.
¿Qué aprenderé en «Verificación de interacciones con mocks»?
Aprenda a verificar que los objetos simulados se hayan invocado con los argumentos esperados y un número específico de veces. Practicas Testing Mastery: JUnit, Mockito & Integration Tests con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Testing Mastery: JUnit, Mockito & Integration Tests?
No se requiere experiencia previa. Testing Mastery: JUnit, Mockito & Integration Tests en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Verificación de interacciones con mocks»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Testing Mastery: JUnit, Mockito & Integration Tests?
Sí. Cada lección de Testing Mastery: JUnit, Mockito & Integration Tests incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Mocks, stubs y fakes
- Creación de mocks con Mockito
- Verificación de interacciones con mocks
- Inyección de mocks con @Mock y @InjectMocks