@MockBean vs @Mock en Spring Boot

@Mock vs @MockBean en Spring Boot

@Mock vs @MockBean en Spring Boot


En esta entrada vamos a ver el uso de @MockBean vs @Mock en Spring Boot. Cuando creamos la parte de testing en nuestra aplicaciones de Spring Boot, a veces nos surge la duda si hacer uso de Mockito.mock() o @Mock o hacer uso de @MockBean. En este artículo vamos a ver qué aplicar según nuestras necesidades.

Ambas anotaciones se usan para testing. @Mock pertenece al framework de Mockito y @MockBean pertenece al framework de Spring.

¿Qué es Mockito?

Mockito es un framework creado para Java de código abierto que se encuentra publicado bajo la licencia MIT. Mockito nos permite crear y simular objetos para nuestras pruebas automatizadas.

Anotación @Mock y Mockito.mock()

@Mock es la anotación o abreviatura de Mockito.mock(). La cual nos permite crear objetos que imitan a una clase o interfaz.

Tanto @Mock como Mockito.mock() nos va a devolver un valor u objeto cuando los invoquemos.

Para el uso de @Mock debemos tener en cuenta que únicamente podemos hacer uso de clases de test, en cambio Mockito.mock() puede ser aplicado en otras partes. Al hacer uso de la anotación de Spring @SpringBootTest las anotaciones para @Mock se activan.

@SpringBootTest
public class UserRepositoryUnitTest {
    
    @Mock
    UserRepository userMockRepository;
    
    @Test
    public void given_id_when_get_user_by_id_then_return_user_mocked() {
        Mockito.when(userMockRepository.findById(anyString())).thenReturn(userMocked());

        User user = userMockRepository.findById("1");

        Assert.assertEquals("1", user.getId());
        Assert.assertEquals("Pepe", user.getName());

        Mockito.verify(userMockRepository,times(1)).findById("1");
    }
}

El uso de Mockito.verify(), nos permite comprobar si el método se ha ejecutado y cuántas veces.

Anotación MockBean de Spring Boot

@MockBean de Spring Boot lo vamos a utilizar cuando queramos hacer mock de un objeto que se encuentre en el application context de Spring. @MockBean se encargará de realizar un reemplazo del bean con lo que queremos simular en nuestro test.

Para aquellos casos en los que no tengamos un bean definido del tipo que estamos haciendo @MockBean, un nuevo bean será creado.

Lo que hace Spring por debajo será cargar y registrar este nuevo «bean» en el application context.

@SpringBootTest
public class UserRepositoryIT {
    
    @MockBean
    UserRepository userMockRepository;
    
    @Autowired
    UserService userService;
    
    @Test
    public void given_id_when_get_user_by_id_then_return_user_mocked() {
        Mockito.when(userMockRepository.findById(anyString())).thenReturn(userMocked());

        User user = userMockRepository.findById("1");

        Assert.assertEquals("1", user.getId());
        Assert.assertEquals("Pepe", user.getName());

        Mockito.verify(userMockRepository,times(1)).findById("1");
    }
}

En el caso anterior hemos hecho uso de MockBean para simular el bean de UserRepository. Además hemos hecho uso de Mockito.verify para comprobar el número de veces que se llama el método findById.

Cuándo usar @Mock o @MockBean?

La principal diferencia entre @MockBean y @Mock es que @MockBean nos va a reemplazar el bean existente o crear uno nuevo y @Mock va a simular un objeto o interfaz. El principal uso de @MockBean suele ser para sustituir un bean de terceros como una llamda Rest u otras capas de la aplicación simulando el flujo completo de la aplicación pudiendo asignar valores concretos en las diferentes llamadas.

Conclusión

En esta entrada hemos visto el uso de @MockBean vs @Mock en Spring Boot para nuestros test en Spring Boot. Tanto el uso de @Mock y @MockBean será imprescindibles para realizar pruebas unitarias de nuestra aplicación.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *