2013-04-05 35 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

相关问题