2012-10-09 23 views
5

Ich benutze das Grails Spring Security Plugin für mein Projekt und wollen nun Einheit meinen Code testen. Ich habe den folgenden Code in meinem Controller:Grails Spring Security Testing

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

My Test-Klasse hat den folgenden Code:

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

Dieser Test schlägt fehl:

| 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) 

Wie kann ich eine Feder Sicherheits Benutzer authentifizieren in einem Testfall? Wie würden Sie den Komponententest schreiben?

Antwort

0

Es scheint, dass Ihr Verweis auf springSecurityService null ist. Solange Sie in Ihrem Controller ein Feld mit dem Namen springSecurityService haben, sollte es injiziert werden. Verwenden Sie es nur als lokale Variable in Ihrer Indexmethode und haben es nicht als Feld deklariert?

Mein UserController ist wie folgt:

class UserController { 

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

    .... 
} 

UPDATE

Basierend auf Ihre Kommentare zu dieser Antwort, haben Sie ein springSecurityService Feld in Ihrem Controller deklarieren. Ich habe meine Arbeit Anwendung und versucht, einen Test, der Ihnen mit meinem Controller-Methode spiegelt:

@TestFor(UserController) 
class UserControllerTests { 

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

ich auch eine Nullpointer bekam. Von Burts Antwort (Ich habe das nicht wissen), ich glaube, die springSecurityService Instanz in den Kontexten der Einheit Testausführung null ist.

+0

In meinem Controller habe ich: Klasse Usercontroller { \t \t def springSecurityService ... – Nadya

+0

Soll ich schreiben, dass in der ControllerTest nach unten? – Nadya

+0

@ user1726376 Nein, Sie sollten es nicht im ControllerTest brauchen. Ich habe nur sichergestellt, dass Sie einen Verweis auf "springSecurityService" aufgrund der Tatsache, dass Sie die Fehlermeldung "Kann die Eigenschaft 'currentUser' auf Null-Objekt nicht bekommen". –

3

Für etwas so einfach würde ich nicht mit komplizierten Mocks, ein einfaches

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

würde ausreichen, um stören.

+0

Dies funktioniert nicht. Ich erhalte 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: Objekt kann nicht werfen '{current = {id = 1}}' mit Klasse 'java.util.LinkedHashMap' Klasse 'grails.plugin.springsecurity.SpringSecurityService' durch zu: groovy.lang.ReadOnlyPropertyException: current für Klasse: nicht nur lesbar Eigenschaft Kann grails.plugin.springsecurity.SpringSecurityService' – lmo

+0

@lmo Mock nur verwenden 'def springSecurityService' es in Ihrem Controller, wenn Sie arbeiten, ich vorgeschlagen habe gewonnen funktioniert nicht, wenn Sie eine getippte Deklaration 'SpringSecurityService springSecurityService' haben –

7

Sie haben für die Sicherheit Funktionstests zu verwenden. Komponententests verwenden Spott, haben aber keine Plugins oder eine echte Anfrage. Spring Security wird mit einer Filterkette implementiert, sodass Sie einen echten laufenden Server benötigen. Wenn Sie Mocks verwenden, testen Sie nur das Mocking.

Verwandte Themen