1

我想要一个测试,通过控制器中可用的所有方法并检索与这些方法关联的角色。我知道它应该是一个功能测试(而不是单元测试),但我仍然不知道如何请求与方法关联的角色列表。假设我有这个控制器:

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

有什么建议么?谢谢。

4

1 回答 1

1

您可以使用反射 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身份验证,因此说:“执行此代码,就好像用户名成功登录一样”。

看来您确实需要使用功能测试。见伯特的评论。我仍然认为创建测试只是为了验证方法是否具有注释不是有效的努力。

于 2013-04-05T19:50:49.223 回答