Estos snippets de código para entrevista acerca de mockito espero te sean de mucha utilidad. Claro que también los puedes usar para tu desarrollo en el día a día.
Mock básico
import static org.mockito.Mockito.*;
List<String> mockedList = mock(List.class); //clase a simular
when(mockedList.get(0)).thenReturn("hello"); //comportamiento simulado
//llamadas
assertEquals("hello", mockedList.get(0));
mockedList.add("test");
//verificaciones
verify(mockedList).add("test");
verify(mockedList, times(1)).add("test");
verify(mockedList, never()).clear();
Si te llegan a mostrar algo como esto es mejor que sospeches, mockito se usa principalmente para pruebas de integración. Si llegas a ver código como este, lo más probable es que el desarrollador solamente quisiera llegar a su cuota de code coverage.
Mock e inject mocks
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService; //lugar donde se usa el mock
@Test
void shouldReturnUser() {
//comportamiento simulado
when(userRepository.findById(1L))
.thenReturn(Optional.of(new User(1L, "John")));
when(userRepository.findById(1L))
.thenThrow(new RuntimeException("DB error")); //simulación de errores
User user = userService.getUser(1L); //método que usa la clase a simular
//verificaciones
assertEquals("John", user.getName());
assertThrows(RuntimeException.class, () -> {
userService.getUser(1L);
});
}
}
Esta es la forma más común de usar mockito, simular respuestas y errores. Cuando simulamos una respuesta que siempre es la misma se le llama stub, cuando cambia dependiendo de alguna condición se le conoce como mock.