2012-10-09 29 views
5

私はGrails Spring Security Pluginをプロジェクト用に使用しています。これで自分のコードをユニットテストしたいと思っています。私は自分のコントローラに次のコードを持っている:Grails Spring Security Testing

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) 

どのように私は春のセキュリティユーザを認証することができます

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

私のテストクラスには、次のコードを持っていますテストケースで?単体テストはどうやって書くのですか?

答えて

0

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

マイUserControllerは次のとおりです。

class UserController { 

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

    .... 
} 

UPDATE

この回答へのご意見をもとに、あなたはあなたのコントローラでspringSecurityServiceフィールドを宣言しました。私は自分の作業アプリケーションを取って、私のコントローラメソッドであなたのミラーのテストを試してみました:

@TestFor(UserController) 
class UserControllerTests { 

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

私もNullPointerExceptionが得ました。バートの答え(私はこれを知らなかった)から、私はspringSecurityServiceインスタンスがユニットテストの実行のコンテキストでnullだと思う。この単純な何かのために

+0

: クラスUserControllerで{ \t \t springSecurityService デフ... – Nadya

+0

私はControllerTestのそれを書き留めべきでしょうか? – Nadya

+0

@ user1726376いいえ、ControllerTestには必要ありません。私はあなたが 'springSecurityService'への参照を持っていることを確認していました。なぜなら、エラーメッセージ"ヌルオブジェクトでcurrentUserプロパティを取得できません "という事実があったからです。 –

3

私は簡単

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

は十分であろう、複雑なモックを気にしないでしょう。

+0

これは動作しません。 'org.codehaus.groovy.runtime.typehandling.GroovyCastExceptionが発生しました:クラス 'java.util.LinkedHashMap'でオブジェクト '{currentUser = {id = 1}}'をクラス 'grails.plugin.springsecurity.SpringSecurityService'にキャストできません:groovy.lang.ReadOnlyPropertyException:readonlyプロパティを設定できません:class:grails.plugin.springsecurity.SpringSecurityService'のためのcurrentUser – lmo

+0

@lmo私が提案したモックはあなたのコントローラで 'def springSecurityService'を使用した場合にのみ動作します。型指定された宣言 'SpringSecurityService springSecurityService'があれば動作しません –

7

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

関連する問題