我想进行一次测试,以测试 Controller 中可用的所有方法并检索与这些方法相关的角色。我知道这应该是功能测试(而不是单元测试),但是我仍然不知道如何请求与方法关联的角色列表。
假设我有这个 Controller :
@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"))
有什么建议么?
谢谢。
最佳答案
您可以使用Reflection API做到这一点。就像是:
Method m = MyController.class.getMethod("methodB");
Annotation[] annos = m.getAnnotations();
但是我认为这不是对您的方法的良好验证,因为它只能确保您正确输入角色名称。我认为最好尝试调用该 Action 并检查该进程是否重定向到拒绝。
@TestFor(MyController)
class MyControllerTests {
@Test
void shouldRedirectToDenied() {
SpringSecurityUtils.doWithAuth('username') {
controller.methodB()
assert controller.response.redirectedUrl == '/login/denied'
}
}
}
doWithAuth
闭包将模拟用户名的身份验证,所以说的是相同的:“就像成功登录用户名一样执行此代码”。看来您确实需要使用功能测试。参见伯特的评论。我仍然认为这不是一个有效的尝试,只是创建一个测试来验证该方法是否具有注释。
关于security - Grails Spring Security获得分配给方法的角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840355/