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.

Creación de pruebas Junit cuando los métodos del controlador requieren autenticación.

He seguido un curso sobre TDD y he escrito mis pruebas de unidad con JUnit y todo estaba funcionando bien. Desde entonces, he creado algunos métodos en mi clase UserController para que solo ciertos roles tengan acceso a ellos, como un método para crear un nuevo User.

Ahora que he hecho esto, algunas pruebas están fallando porque estoy recibiendo 401 UNAUTHORIZED en lugar de 200 OK. Entiendo por qué, pero no estoy seguro de cómo probar correctamente estos métodos.

He intentado lo siguiente, que pensé que autenticaría a un usuario falso con el rol correcto y luego ejecutaría los métodos, pero aún así obtengo 401 UNAUTHORIZED. He creado una clase separada que contiene algunos métodos para crear entidades válidas e inválidas, como Users.

@Test
    public void postUser<em>whenUserIsValid</em>receiveOK() {
        // Guardar sociedad en la base de datos
        societyService.save(TestUtil.createValidSociety());
        // Crear nuevo usuario
        User user = TestUtil.createValidUser();
        // Autenticar usuario
        authenticate("test-user");

        ResponseEntity&lt;Object&gt; response = postSignup(user, Object.class);

        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
}

Mi método de autenticación es el siguiente:


private void authenticate(String username) {
testRestTemplate.getRestTemplate()
.getInterceptors().add(new BasicAuthenticationInterceptor(username, "P4ssword"));
}

Y mi método postSignup es el siguiente:


public <T> ResponseEntity<T> postSignup(Object request, Class<T> response) {
return testRestTemplate.postForEntity(API_1_0_USERS, request, response);
}

¿Alguien puede ver dónde me estoy equivocando?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en JUnit y Spring Security, parece que el problema aquí es que el método ‘authenticate’ solo está configurando un interceptor de autenticación básica para el REST template, pero la clase ‘UserController’ espera una autenticación de Spring Security. Esto significa que la solicitud HTTP no tendrá las credenciales de autenticación necesarias requeridas por ‘UserController’.

    Una solución potencial sería modificar el método ‘authenticate’ para usar autenticación de Spring Security en su lugar, agregando los roles y autoridades necesarios al objeto de autenticación. Esto aseguraría que ‘UserController’ pueda autorizar correctamente la solicitud.

    Otra solución sería modificar ‘UserController’ para permitir la autenticación básica, en lugar de solo permitir la autenticación de Spring Security. Esto permitiría que el caso de prueba existente pase, al tiempo que proporcionaría soporte para la autenticación básica en el futuro.

    En cualquier caso, puede ser útil revisar la configuración de Spring Security para ‘UserController’, para asegurarse de que esté correctamente configurada para manejar los requisitos de autenticación y autorización para los métodos que requieren roles específicos.

Comments are closed.