2012-10-09 127 views
5

我爲我的項目使用了Grails Spring Security Plugin,現在想單元測試我的代碼。我有下面的代碼在我的控制器:Grails Spring Security Testing

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

我測試類具有下面的代碼:

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

該測試失敗:

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

我如何可以驗證彈簧安全用戶在一個測試案例中?你會如何編寫單元測試?

回答

0

看來您對springSecurityService的引用爲空。只要您的控制器中有一個名爲springSecurityService的字段,它應該被注入。您是否僅在您的索引方法中將其作爲局部變量使用,並沒有將其聲明爲字段?

UserController如下:

class UserController { 

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

    .... 
} 

UPDATE

根據您的意見對這個答案,你是在你的控制器聲明springSecurityService場。我把我的工作的應用程序,並試圖,反映你與我的控制器方法測試:

@TestFor(UserController) 
class UserControllerTests { 

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

我得到一個NullPointerException爲好。從Burt的回答(我不知道這一點),我認爲springSecurityService實例在單元測試執行的上下文中爲null。

+0

在我的控制,我有: 類UserController的{ \t \t高清springSecurityService ... – Nadya

+0

我應該寫下來的ControllerTest? – Nadya

+0

@ user1726376不,你不應該在ControllerTest中需要它。我只是確保你有一個'springSecurityService'的引用,因爲你有錯誤消息「無法獲得屬性'currentUser'在空對象上」。 –

3

對於一些這個簡單,我不會用複雜的嘲笑打擾,一個簡單的

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

就足夠了。

+0

這不起作用。我得到'org.codehaus.groovy.runtime.typehandling.GroovyCastException:無法將類'java.util.LinkedHashMap'的對象'{currentUser = {id = 1}}'轉換爲class'grails.plugin.springsecurity.SpringSecurityService' to:groovy.lang.ReadOnlyPropertyException:無法設置只讀屬性:currentUser類:grails.plugin.springsecurity.SpringSecurityService' – lmo

+0

@lmo我建議的模擬只有在你的控制器中使用'def springSecurityService'時纔會起作用,如果你有一個類型化的聲明'SpringSecurityService springSecurityService',你就不會工作 –

7

您必須使用功能測試來確保安全性。單元測試使用模擬,但沒有可用的插件或真正的請求。 Spring Security是通過一個過濾器鏈來實現的,所以你需要一個真正的運行服務器。如果你使用模擬,你只是測試模擬。