fbpx

PRUEBAS de INTEGRACIÓN en SPRING BOOT

Como sugiere el nombre, las pruebas de integración se enfocan en integrar diferentes capas de la aplicación. Eso también significa que no hay mocks o clases simuladas en nuestras pruebas, es decir, se ejecutará nuestro código desde la capa primera donde se expone nuestros datos, hasta la última capa dónde se recogen o manipulan los datos.

Configurando una prueba de integración

Anotación @SpringBootTest

La anotación @SpringBootTest es útil cuando necesitamos arrancar todo el contexto de test de Spring. La anotación funciona creando el ApplicationContext que se utilizará en nuestras pruebas.

  • Utiliza SpringBootContextLoader como ContextLoader predeterminado cuando no se define un @ContextConfiguration(loader=…) específico.
  • Busca automáticamente una @SpringBootConfiguration cuando no se usa una @Configuración anidada y no se especifican clases explícitas.
  • Permite definir propiedades de entorno personalizadas mediante el atributo de propiedades.
  • Permite que los argumentos de la aplicación se definan utilizando el atributo args.
  • Brinda soporte para diferentes modos de entorno web, incluida la capacidad de iniciar un servidor web en pleno funcionamiento escuchando en un puerto definido o aleatorio.
@SpringBootTest
class UsuarioControladorTest {}

Anotación @AutoConfigureMockMvc

La anotación @AutoConfigureMockMvc habilita y configura la configuración automática de MockMvc, que se puede aplicar a una clase en la que se realiza los tests.

@SpringBootTest
@AutoConfigureMockMvc
class UsuarioControladorTest {

    @Autowired
    private MockMvc mockMvc;
}

MockMvc

Para realizar nuestra prueba de integración necesitaremos la forma de poder testear nuestras hipotesis a través de una petición y la respuesta esperada para ello tenemos que inyectar a través de @Autowired.

MockMvc nos proporciona métodos en los que podemos realizar llamadas HTTP a nuestro servidor de pruebas que se crea gracias a el contexto de test en Spring Boot y además herramientas para enviar datos en nuestra petición HTTP y además los datos que esperamos por dicha petición. Ejemplo del uso de MockMvc:

@SpringBootTest
@AutoConfigureMockMvc
class UsuarioControladorTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void CUANDO_se_llama_a_usuarios_ENTONCES_el_estado_es_200() throws Exception {

        mockMvc.perform(MockMvcRequestBuilders.get("/usuarios")
                        .contentType(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers
                        .status()
                        .isOk())
                .andExpect(MockMvcResultMatchers
                        .content()
                        .contentTypeCompatibleWith(MediaType.APPLICATION_JSON));
    }
}

Método perform()

Es el método principal que es usado para realizar nuestras pruebas de integración, en el que cuál ejecuta nuestra petición en la que luego podremos testear la respuesta esperada. Éste método acepta un parámetro en el que se suele usar los métodos estáticos de la clase MockMvcRequestBuilders para especificar que tipo de método HTTP se usará para realizar la petición.

@SpringBootTest
@AutoConfigureMockMvc
class UsuarioControladorTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void perform() throws Exception {

        mockMvc.perform(MockMvcRequestBuilders.get("/usuarios")
                        .contentType(MediaType.APPLICATION_JSON))
    }
}

Método andExpect()

El método andExpect() se usa tras llamar el método perform() para verificar diferentes parámetros de respuesta.

@SpringBootTest
@AutoConfigureMockMvc
class UsuarioControladorTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void CUANDO_se_llama_a_usuarios_ENTONCES_el_estado_es_200() throws Exception {

        mockMvc.perform(MockMvcRequestBuilders.get("/usuarios")
                        .contentType(MediaType.APPLICATION_JSON))
                .andExpectAll(MockMvcResultMatchers
                                .status()
                                .isOk(),
                        MockMvcResultMatchers
                                .content()
                                .contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers
                        .status()
                        .isOk())
                .andExpect(MockMvcResultMatchers
                        .content()
                        .contentTypeCompatibleWith(MediaType.APPLICATION_JSON));
    }
}
jsonPath()

Podemos usar el método jsonPath() para verificar diferentes datos de respuesta que sean de tipo JSON gracias la sintaxis de jsonpath.

@SpringBootTest
@AutoConfigureMockMvc
class UsuarioControladorTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void CUANDO_se_llama_a_usuarios_ENTONCES_el_estado_es_200() throws Exception {

        mockMvc.perform(MockMvcRequestBuilders.get("/usuarios")
                        .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(MockMvcResultMatchers
                        .content()
                        .contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath("$[0].nombre", is("Juan")));
    }
}