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

これは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認証を偽装するため、「ユーザー名が正常にログインしたかのようにこのコードを実行してください」と言うのと同じです。

実際に機能テストを使用する必要があるようです。バートのコメントを参照してください。メソッドに注釈があるかどうかを検証するためだけにテストを作成することは、有効な取り組みではないと私はまだ考えています。

于 2013-04-05T19:50:49.223 に答える