1

いくつかのレガシー コードを処理する必要があります。次のような関数が必要なポイントが1つあります

NewCodeAccessor.get() は、Guice から取得したオブジェクトを提供します。

public class NewCodeAccessor {
    @Inject
    public static Provider<PageDataHandle> pageDataHandleProvider;

    public static PageDataHandle get() {
        return pageDataHandleProvider.get();
    }
}

Guice は以前に初期化されており、このクラスへの静的注入が要求されています。

本番コードではこれで問題なく動作しますが、今はテストを試みています。PageDataHandle はリクエスト スコープなので、テストは次のようになります。

@Before
public void setUp() {
    Injector createInjector = Guice.createInjector(new ServletModule(), 
        new AppModule());
}

@Test
public void testGetInjector() throws Exception {

    // put it inside a callable to wrap it in a request scope, as it would
    // usually be done in a request on the server
    Callable<PageDataHandle> scopeRequest = ServletScopes.scopeRequest(
            new Callable<PageDataHandle>() {
                @Override
                public PageDataHandle call() throws Exception {
                    PageDataHandle data = NewCodeAccessor.get();
                    return data;
                }
            }, Collections.<Key<?>, Object> emptyMap());
    PageDataHandle data = scopeRequest.call();
    assertTrue(data != null);
}

PageDataHandle またはその依存関係が要求パラメーターの注入を要求しない限り、これは引き続き機能します。

@Inject @RequestParameters Map<String, String[]> requestParameters

ここで OutOfScope Exception が発生します: com.google.inject.ProvisionException: Guice provision errors:

1) カスタム プロバイダのエラー、com.google.inject.OutOfScopeException: 範囲指定されたオブジェクトにアクセスできません。現在、HTTP サーブレット リクエスト内にいないか、このリクエストのサーブレット フィルタとして com.google.inject.servlet.GuiceFilter を適用するのを忘れている可能性があります。

次のような独自のテスト モジュールを追加しようとしました。

bind(new TypeLiteral<Map<String, String[]>>() {
    }).annotatedWith(com.google.inject.servlet.RequestParameters.class)
    .toInstance(parameters);

しかし、RequestParameters はすでに ServletRequest によってバインドされているため、これは機能しません。

私ができることは次のとおりです。テスト用に作成したインジェクターの ServletModule を省略し、RequestScope を独自のカスタム スコープにバインドします。そうすれば、RequestParameters は他の誰にもバインドされないので、それをモックする独自のバインドを作成できます。しかし、それは良くないようです。誰かがこれを適切に行う方法を教えてもらえますか? ありがとう!

4

1 に答える 1