5

プロジェクトにGrailsS​​pringSecurityプラグインを使用していますが、コードの単体テストを行いたいと考えています。コントローラに次のコードがあります。

def index() {
    redirect action: 'show', params: [id: springSecurityService.currentUser.id]
}

私のテストクラスには次のコードがあります。

void testIndex() {      
    controller.index()
    assert "/user/list" == response.redirectedUrl
}

このテストは失敗します:

| Running 8 unit tests... 1 of 8
| Failure:  testIndex(xxx.UserControllerTests)
|  java.lang.NullPointerException: Cannot get property 'currentUser' on null object
    at xxx.UserController.index(UserController.groovy:12)
    at xxx.UserControllerTests.testIndex(UserControllerTests.groovy:19)

テストケースでSpringSecurityユーザーを認証するにはどうすればよいですか?ユニットテストをどのように記述しますか?

4

3 に答える 3

7

セキュリティのために機能テストを使用する必要があります。ユニットテストはモックを使用しますが、プラグインや実際のリクエストはありません。Spring Securityはフィルターチェーンで実装されているため、実際に実行されているサーバーが必要です。モックを使用する場合は、モックをテストしているだけです。

于 2012-10-09T19:37:56.263 に答える
4

この単純なものについては、複雑なモック、簡単なモックは気にしません。

controller.springSecurityService = [currentUser:[id:1]]

で十分でしょう。

于 2012-10-09T19:37:19.853 に答える
0

への参照springSecurityServiceが null のようです。コントローラーに という名前のフィールドがある限りspringSecurityService、それを注入する必要があります。インデックス メソッドでのみローカル変数として使用し、フィールドとして宣言していませんか?

私のUserControllerは次のとおりです。

class UserController {

    /**
     * Dependency injection for the springSecurityService.
     */
    def springSecurityService

    ....
 }

アップデート

この回答へのコメントに基づいてspringSecurityService、コントローラーでフィールドを宣言しました。作業中のアプリケーションを使用して、コントローラー メソッドを使用してあなたのアプリケーションをミラーリングするテストを試みました。

@TestFor(UserController)
class UserControllerTests {

    void testSomething() {
        controller.register()
    }
}

NullPointerException も取得しました。springSecurityServiceBurt の回答から (私はこれを知りませんでした)、インスタンスは単体テストの実行のコンテキストでは nullだと思います。

于 2012-10-09T19:34:26.537 に答える