3

認証されたルートを持つプレイアプリケーションがあります。ユーザーをelasticsearchに保存するAuthenticatorを実装しました。コントローラーのセキュリティ保護されたメソッドには、@Security.Authenticated注釈が付けられています。mockito を使用した単体テストで、このクラスをモックしたいのですが、その方法がわかりません。

GuiceでDIを使用しています。だから私はこのアプローチを試しました:

  1. 次のように AuthenticatorWrapper を開発します。

    public class AuthenticatorWrapper extends Security.Authenticator {
    
        private Authenticator authenticator;
    
        @Override
        public String getUsername(Http.Context ctx) {
            return authenticator.getUsername(ctx);
        }
    
        @Override
        public Result onUnauthorized(Http.Context ctx) {
            return authenticator.onUnauthorized(ctx);
        }
    
        @Inject
        public void setAuthenticator(Authenticator authenticator) {
            this.authenticator = authenticator;
        }
    }
    

    このクラスには、パラメーターとして Authenticator があり、アプリの起動時に Guice によって注入されることになっています。

  2. クラスのバインディングを定義するguiceモジュールを開発しましAuthenticator.classMyCustomAuthenticator.class

  3. セキュリティで保護されたルートには注釈が付けられています@Security.Authenticated(AuthenticatorWrapper.class)

私のテストでは、クラスのモックを簡単に提供して、モックをMyCustomAuthenticator作成し、テスト スコープの Guice モジュールを定義Authenticator.classし、モックへのバインディングを定義できます。

これでうまくいくはずだと思ったのですが、そうではありません。通常の実行時または私のテストの両方で、バインディングが機能していないようです。nullPointerException次の場合にラッパーから持っています:Authenticatorパラメータが Guice によって注入されません。

だから私の質問は:

  • オーセンティケーターは、Guice からオーセンティケーターを注入するための適切なアプローチですか? Guice のアノテーションに play Authenticator を挿入する簡単な方法はないでしょうか?
  • Authenticator が Guice によってラッパーに挿入されないのは正常ですか? [編集 -> はい、注釈はオブジェクトを手動でインスタンス化し、guice を使用しないためです。私は正しいですか? ]
  • MyCustomAuthenticatorアノテーションに直接設定することでアプリケーションを簡素化できますが、テストでこのオーセンティケーターをモックするにはどうすればよいでしょうか?

ありがとう :)

4

1 に答える 1

0

A は回避策を見つけました。Play フレームワーク 2.4 は Guice を完全に統合しているため、Play フレームワーク 2.4 が提供するアクセス メソッドを使用しました。これが私の認証ラッパークラスです:

public class AuthenticatorWrapper extends Security.Authenticator {

    private final Security.Authenticator authenticator;

    public AuthenticatorWrapper() {
        authenticator = Play.application().injector().instanceOf(Security.Authenticator.class);
    }

    @Override
    public String getUsername(Http.Context ctx) {
        return authenticator.getUsername(ctx);
    }

    @Override
    public Result onUnauthorized(Http.Context ctx) {
        return authenticator.onUnauthorized(ctx);
    }
}

Play.application().injector()アクセサーを使用して、Guice が提供するSecurity.Authenticatorインスタンスを取得するだけです。したがって、私の application.conf では、Security.Authenticator を目的の実装にバインドする Guice モジュールを構成するだけです。

于 2015-03-31T12:19:14.447 に答える