2012-10-09 15 views
5

Używam wtyczki Grails Spring Security do mojego projektu, a teraz chcę przetestować mój kod. Mam następujący kod w moim kontrolera:Grails Spring Security Testing

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

moja klasa testowa ma następujący kod:

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

Ten test nie powiedzie się:

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

Jak mogę uwierzytelnić użytkownika Zabezpieczenia wiosna w przypadku testowym? Jak byś napisał test jednostkowy?

Odpowiedz

0

Wygląda na to, że twoje odniesienie do springSecurityService jest puste. Dopóki masz pole w kontrolerze o nazwie springSecurityService, powinno ono zostać wstrzyknięte. Czy używasz go jako zmiennej lokalnej tylko w swojej metodzie indeksu i nie zadeklarowałeś go jako pola?

My UserController jest następujący:

class UserController { 

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

    .... 
} 

UPDATE

podstawie swoich komentarzach do tej odpowiedzi, to nie ogłoszono pole springSecurityService w kontrolerze. Wziąłem mój wniosek roboczą i spróbował test, który odzwierciedla ciebie z moją metodą Kontroler:

@TestFor(UserController) 
class UserControllerTests { 

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

mam NullPointerException również. Z odpowiedzi Burt'a (nie wiedziałem o tym), myślę, że instancja springSecurityService ma wartość zerową w kontekście wykonania testu jednostkowego.

+0

W moim kontroler mam: klasy UserController { \t \t def springSecurityService ... – Nadya

+0

powinienem napisać, że w dół w ControllerTest? – Nadya

+0

@ user1726376 Nie, nie powinieneś go potrzebować w usłudze ControllerTest. Właśnie upewniałem się, że masz odniesienie do 'springSecurityService' ze względu na fakt, że masz komunikat o błędzie" Nie można pobrać własności 'currentUser' na obiekcie zerowym ". –

3

Na coś prostego to nie przeszkadza ze skomplikowanymi mocks, prosty

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

byłoby wystarczające.

+0

To nie działa. Dostaję 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: Nie można rzucić obiektu '{currentUser = {id = 1}}' z klasą 'java.util.LinkedHashMap' na klasę 'grails.plugin.springsecurity.SpringSecurityService' do: groovy.lang.ReadOnlyPropertyException: Nie można ustawić właściwości readonly: currentUser dla klasy: grails.plugin.springsecurity.SpringSecurityService' – lmo

+0

@musowana sztuczka, którą zasugerowałem, działa tylko, jeśli użyjesz 'def springSecurityService' w swoim kontrolerze, wygrałeś 't działa, jeśli masz deklarację na maszynie 'SpringSecurityService springSecurityService' –

7

Musisz użyć testów funkcjonalnych dla bezpieczeństwa. Testy jednostkowe używają szyderstwa, ale nie mają dostępnych wtyczek lub prawdziwej prośby. Spring Security jest zaimplementowany z łańcuchem filtrów, więc potrzebujesz prawdziwego działającego serwera. Jeśli używasz mocks, po prostu testujesz kpiny.

Powiązane problemy