2012-10-09 35 views
5

Utilizo el plugin Grails Spring Security para mi proyecto y ahora quiero probar mi código unitariamente. Tengo el siguiente código en mi controlador:Grails Spring Security Testing

def index() { 
    redirect action: 'show', params: [id: springSecurityService.currentUser.id] 
} 

mi clase de prueba tiene el siguiente código:

void testIndex() {  
    controller.index() 
    assert "/user/list" == response.redirectedUrl 
} 

Esta prueba falla:

| Running 8 unit tests... 1 of 8 
| Failure: testIndex(xxx.UserControllerTests) 
| java.lang.NullPointerException: Cannot get property 'currentUser' on null object 
    at xxx.UserController.index(UserController.groovy:12) 
    at xxx.UserControllerTests.testIndex(UserControllerTests.groovy:19) 

¿Cómo puedo autenticar a un usuario la seguridad de primavera en un caso de prueba? ¿Cómo escribirías la prueba unitaria?

Respuesta

0

Parece que su referencia a springSecurityService es nula. Siempre que tenga un campo en su controlador llamado springSecurityService, debe ser inyectado. ¿Lo está utilizando como una variable local solo en su método de índice y no lo declaró como un campo?

Mi UserController es el siguiente:

class UserController { 

    /** 
    * Dependency injection for the springSecurityService. 
    */ 
    def springSecurityService 

    .... 
} 

ACTUALIZACIÓN

Sobre la base de sus comentarios a esta respuesta, que se haya declarado un campo springSecurityService en su controlador. Tomé mi solicitud de trabajo y trató de una prueba de que el suyo refleja con mi método de control:

@TestFor(UserController) 
class UserControllerTests { 

    void testSomething() { 
     controller.register() 
    } 
} 

Tengo una NullPointerException también. De la respuesta de Burt, (no sabía esto), creo que la instancia springSecurityService es nula en los contextos de la ejecución de la prueba de unidad.

+0

En mi controlador que tengo: UserController clase { \t \t def springSecurityService ... – Nadya

+0

¿Debo escribir eso en el ControllerTest? – Nadya

+0

@ user1726376 No, no debería necesitarlo en el ControllerTest. Solo me estaba asegurando de que tuviera una referencia a 'springSecurityService' debido al hecho de que tenía el mensaje de error" No se puede obtener la propiedad 'currentUser' en el objeto nulo ". –

3

Por algo este sencillo no me molestaría con burla complicados, un sencillo

controller.springSecurityService = [currentUser:[id:1]] 

sería suficiente.

+0

Esto no funciona. Obtengo 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: No se puede enviar el objeto '{currentUser = {id = 1}}' con la clase 'java.util.LinkedHashMap' a la clase 'grails.plugin.springsecurity.SpringSecurityService' debido a: groovy.lang.ReadOnlyPropertyException: no se puede establecer la propiedad readonly: currentUser for class: grails.plugin.springsecurity.SpringSecurityService' – lmo

+0

@lmo el simulacro que he sugerido solo funcionará si usa 'def springSecurityService' en su controlador, ganó No funcionará si tiene una declaración tipeada 'SpringSecurityService springSecurityService' –

7

Tienes que usar pruebas funcionales para mayor seguridad. Las pruebas unitarias usan burlas pero no tienen complementos disponibles, o una solicitud real. Spring Security está implementado con una cadena de filtro, por lo que necesita un servidor de ejecución real. Si usas burlas, simplemente estás probando la burla.

Cuestiones relacionadas