es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo probar el método postHandle de HandlerInterceptor en Spring Boot.

Tengo cierta lógica dentro del método postHandle del interceptor para exponer un valor de encabezado a mi aplicación frontend de Angular. Mi pregunta es: ¿cómo puedo probar los interceptores?

public class CustomResponseInterceptor implements HandlerInterceptor {
    private final String ADMIN_APP = "ADMIN_APP";
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object,
                           ModelAndView modelAndView) throws Exception {
        AdminApp adminApp = loadAdminApp();
        if(adminApp != null && adminApp.isValidAdminApp()){
            response.addHeader(ADMIN_APP, adminApp.getAppName());
            response.addHeader("Access-Control-Expose-Headers", ADMIN_APP);
        }
    }
}

A continuación se muestra mi caso de prueba para verificar si se agrega el nombre al encabezado o no:

@Test
void checkAdminAppNameInHeaderTest() throws Exception {
    HandlerInterceptor delegate = mock(HandlerInterceptor.class);
    new MappedInterceptor(null, delegate).postHandle(
            mock(HttpServletRequest.class), mock(HttpServletResponse.class), null, mock(ModelAndView.class));
    String adminAppName = response.getHeader(ADMIN_APP);
    assertNotNull(adminAppName);
}

Sin embargo, el encabezado siempre devuelve null en su mayoría porque la solicitud y la respuesta están simuladas aquí. ¿Cómo puedo atravesar la lógica del interceptor para que se llame al método postHandle?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para probar correctamente la lógica del interceptor y verificar los valores del encabezado, deberá configurar una ‘HttpServletRequest’ de prueba y una ‘HttpServletResponse’ con datos reales que activen el método ‘postHandle’, y luego verificar los valores del encabezado agregados por el interceptor. Aquí hay un caso de prueba actualizado que demuestra esto:

    @Test
    void checkAdminAppNameInHeaderTest() throws Exception {
        // configurar solicitud y respuesta simuladas
        HttpServletRequest request = mock(HttpServletRequest.class);
        HttpServletResponse response = mock(HttpServletResponse.class);
    
        // crear una instancia del interceptor
        CustomResponseInterceptor interceptor = new CustomResponseInterceptor();
    
        // activar el método 'postHandle' con datos simulados
        interceptor.postHandle(request, response, null, null);
    
        // verificar que los valores del encabezado se agregaron correctamente
        String adminAppName = response.getHeader(ADMIN_APP);
        assertNotNull(adminAppName);
        assertEquals("expectedAppName", adminAppName);
        String exposedHeaders = response.getHeader("Access-Control-Expose-Headers");
        assertNotNull(exposedHeaders);
        assertTrue(exposedHeaders.contains(ADMIN_APP));
    }
    

    En este caso de prueba, crea una ‘HttpServletRequest’ simulada y una ‘HttpServletResponse’, y luego instancia la clase ‘CustomResponseInterceptor’. Luego activa el método ‘postHandle’ con los datos simulados y utiliza el método ‘getResponse’ en el objeto ‘HttpServletResponse’ para recuperar los valores del encabezado agregados por el interceptor. Luego puede usar las aserciones estándar de JUnit para verificar que los valores del encabezado coincidan con los valores esperados.

    Por supuesto, para que este caso de prueba funcione correctamente, deberá modificar la clase ‘CustomResponseInterceptor’ para utilizar datos reales al agregar los encabezados (por ejemplo, extrayendo el nombre de la aplicación de una base de datos o archivo de configuración).

Comments are closed.