2012-01-20 22 views
12

@Securedという注釈付きのリポジトリメソッドがあります。このメソッドの単体テストを作成しようとしていますが、メソッドを呼び出すために認証が必要なためテストが失敗します。メソッドそのものは、セーブ()メソッドです。私は、メソッドを呼び出すときに私が得るエラーは次のとおりです。mocking authentication spring security

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext 

それは認証が必要なので、私は、このメソッドをテストすることはできません、と私はこれをコールする必要がありますので、私は(私はHSQLDBを使用しています)に対して認証するユーザーを保存することはできません保存する方法。 @securedでアノテーション付けされたメソッドの単体テスト方法、または認証を模擬する方法に関するアドバイス。

答えて

15

テストする内容によって異なります。

  • セキュリティのないアプリケーションのビジネスロジックをテストする場合は、セキュリティを完全に無効にすることができます。 SpringJunit4Runnerを使用すると仮定すると、セキュリティ設定を別のファイルに入れて、@ContextConfigurationに含めないでください。あなたは(@Secured注釈の例正しい仕事)の認可をテストする場合

  • 、あなたは別のファイルに認証設定を置くことができますし、それをロードしない(この場合、すべての認証関連のものをバイパスし、直接SecurityContextにアクセスすることができます同様):

    必要なのはSecurityContextHolderに適切なAuthenticationオブジェクトを置くことです:

    @Test 
    public void myTest() { 
        login(...); 
        ... 
        logout(); 
    } 
    
    private void login(...) { 
        SecurityContextHolder.getContext().setAuthentication(
         new UsernamePasswordAuthenticationToken(...) 
        ) 
    } 
    
    private void logout() { 
        SecurityContextHolder.clearContext(); 
    } 
    
  • 最後に、あなたが認証をテストする場合、あなたはデータベース含む試験データを使用してテストを実行することができます。

+0

残念ながら私はこれを行うことはできません。私の認証マネージャは、私のリポジトリを使ってデータベースからユーザをフェッチするカスタムのuserDetailServiceです。したがって、ユーザーを永続性に保存できない場合、userDetailsS​​erviceはユーザーを見つけられず、結果としてBadCredentials例外が発生します。 –

+0

@vikashdat: – axtavt

5

a)これはユニットテストではなく、統合テストです。ユニットテストは問題ありません。

b)私は、あなたのテスト設定を分けておくつもりです。なぜあなたはセキュリティ関連の機能をテストしていないテストで春のセキュリティを無効にするだけではないのですか?

c)その他すべてが失敗した場合:JdbcTemplateオブジェクトを注入し、テスト設定中にSQLでユーザーデータを手動で作成します。 Support classes for integration testing

+0

実行時にセキュリティを無効にすることができないことがわかりました。セキュリティを無効にする方法を知るために私にリンクできるリソースがありますか? –

+0

@vikashdatそれ以外のやり方:それを有効にしないでください。もちろん、これはどのようなテストであるかによって異なります。オプションではない可能性のある、デプロイされたサーバーに対してテストを行っている場合。 –

+0

私は理解しています。どうしたらいいですか? SpringJunit4Runnerでテストを実行しないことを意味しますか?私がこれを行うと、私はコンポーネントをオートワイヤする能力を失うことになるでしょう。 –