Inyectando Mockito Mocks en Spring Beans

1. Información general

En este artículo, mostraremos cómo usar la inyección de dependencia para insertar simulacros de Mockito en Spring Beans para pruebas unitarias.

En aplicaciones del mundo real, donde los componentes a menudo dependen del acceso a sistemas externos, es importante proporcionar un aislamiento de prueba adecuado para que podamos centrarnos en probar la funcionalidad de una unidad determinada sin tener que involucrar a toda la jerarquía de clases para cada prueba.

Inyectar un simulacro es una forma limpia de introducir tal aislamiento.

2. Dependencias de Maven

Necesitamos las siguientes dependencias de Maven para las pruebas unitarias y los objetos simulados:

 org.springframework.boot spring-boot-starter 2.2.2.RELEASE   org.springframework.boot spring-boot-starter-test 2.2.2.RELEASE test   org.mockito mockito-core 2.21.0 

Decidimos usar Spring Boot para este ejemplo, pero el Spring clásico también funcionará bien.

3. Escribir la prueba

3.1. La lógica empresarial

Primero, creemos un servicio simple que probaremos:

@Service public class NameService { public String getUserName(String id) { return "Real user name"; } }

E inyéctelo en la clase UserService :

@Service public class UserService { private NameService nameService; @Autowired public UserService(NameService nameService) { this.nameService = nameService; } public String getUserName(String id) { return nameService.getUserName(id); } }

Para este tutorial, las clases dadas devuelven un solo nombre independientemente de la identificación proporcionada. Esto se hace para que no nos distraigamos probando ninguna lógica compleja.

También necesitaremos una clase principal estándar de Spring Boot para escanear los beans e inicializar la aplicación:

@SpringBootApplication public class MocksApplication { public static void main(String[] args) { SpringApplication.run(MocksApplication.class, args); } }

3.2. Los exámenes

Ahora pasemos a la lógica de la prueba. En primer lugar, tenemos que configurar el contexto de la aplicación para las pruebas:

@Profile("test") @Configuration public class NameServiceTestConfiguration { @Bean @Primary public NameService nameService() { return Mockito.mock(NameService.class); } }

La anotación @Profile le dice a Spring que aplique esta configuración solo cuando el perfil de "prueba" esté activo. La anotación @Primary está ahí para asegurarse de que se use esta instancia en lugar de una real para el cableado automático. El método en sí crea y devuelve una simulación Mockito de nuestra clase NameService .

Ahora podemos escribir la prueba unitaria:

@ActiveProfiles("test") @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = MocksApplication.class) public class UserServiceUnitTest { @Autowired private UserService userService; @Autowired private NameService nameService; @Test public void whenUserIdIsProvided_thenRetrievedNameIsCorrect() { Mockito.when(nameService.getUserName("SomeId")).thenReturn("Mock user name"); String testName = userService.getUserName("SomeId"); Assert.assertEquals("Mock user name", testName); } }

Usamos la anotación @ActiveProfiles para habilitar el perfil de "prueba" y activar la configuración simulada que escribimos anteriormente. Debido a esto, Spring conecta automáticamente una instancia real de la clase UserService , pero una simulación de la clase NameService . La prueba en sí es una prueba JUnit + Mockito bastante típica. Configuramos el comportamiento deseado del simulacro, luego llamamos al método que queremos probar y afirmamos que devuelve el valor que esperamos.

También es posible (aunque no recomendado) evitar el uso de perfiles de entorno en tales pruebas. Para hacerlo, elimine las anotaciones @Profile y @ActiveProfiles y agregue una anotación @ContextConfiguration (classes = NameServiceTestConfiguration.class) a la clase UserServiceTest .

4. Conclusión

En este rápido tutorial, mostramos lo fácil que es inyectar mocks de Mockito en Spring Beans.

Como de costumbre, todos los ejemplos de código están disponibles en GitHub.