2013-04-05 77 views
1

我想要一個測試,通過控制器中可用的所有方法並檢索與這些方法關聯的角色。我知道它應該是一個功能測試(與單元測試相對),但我仍然不知道如何請求與方法相關的角色列表。 比方說,我有這樣的控制器:Grails Spring Security將角色分配給一個方法

@Secured("hasAnyRole('ROLE_1')" 
class MyController { 
    def methodA() {} 

    @Secured("hasAnyRole('ROLE_2')" 
    def methodB() {} 
} 

在我的測試,我想有這樣的事情:

assertEquals(['ROLE_1'],getRoles(MyController.class, "methodA")) 
assertEquals(['ROLE_1', 'ROLE_2'],getRoles(MyController.class, "methodB")) 

有什麼建議? 謝謝。

回答

1

你可以用Reflection API來做到這一點。喜歡的東西:

Method m = MyController.class.getMethod("methodB"); 
Annotation[] annos = m.getAnnotations(); 

但我不認爲這是你的方法了良好的驗證,因爲它只能保證你寫正確的角色名稱。我認爲您最好嘗試調用該操作並檢查該進程是否被重定向爲拒絕。

@TestFor(MyController) 
class MyControllerTests { 
    @Test 
    void shouldRedirectToDenied() { 
    SpringSecurityUtils.doWithAuth('username') { 
     controller.methodB() 
     assert controller.response.redirectedUrl == '/login/denied' 
    } 
    } 
} 

doWithAuth關閉將嘲笑爲用戶名的驗證,所以這是說的一樣:「就好像用戶名在登錄成功做到這一點的代碼」。

看來你需要確屬自用的功能測試。見Burt的評論。我仍認爲這不是一個有效的工作,只是爲了驗證方法是否有註解才創建測試。

+0

春季安全不集成測試活動的,因爲它與一個過濾器鏈來實現,而這些要求都只是'MockHttpServletRequest's,不是真正的請求在一個容器中運行。如果要測試控制器是否正確保護,則必須使用功能測試。 – 2013-04-05 20:02:03

+0

感謝您澄清@BurtBeckwith! – 2013-04-05 20:07:43

+0

我知道我需要功能測試,但是我仍然不知道如何才能獲取函數的角色列表,而不是先嚐試對用戶進行身份驗證,然後嘗試訪問函數。 – sjcomp 2013-04-08 19:29:18

相關問題