Guice と Guice Servlet 拡張機能を使用してインスタンス化された Java Web アプリケーションがあります。このアプリケーションには、Guice によってインスタンス化される Quartz ジョブも含まれています。これらのジョブの単体テストを書きたいと思います。
ジョブ クラスは、Provider<HttpServletRequest>
. get
生産的なセットアップでは、ジョブは Guice によって正常にインスタンス化でき、ジョブは期待どおりに機能します。これは、サーブレット リクエスト プロバイダーでをトリガーするコラボレーターのコードを呼び出すことがないためです。get
ジョブは、サーブレットへの HTTP 要求の一部としてではなく、一部のワーカー スレッドによって実行されるため、このような呼び出しは失敗します。
ここで私の質問は、JUnit テストで Guice をセットアップして同じ動作を得る方法です。つまり、ジョブ クラスをインスタンス化できますが、範囲外の@RequestScoped
オブジェクトを使用しようとするとすべて失敗します。
2 つの簡単な解決策がありますが、私にはうまくいきません。
何もバインドしないHttpServletRequest
と、テスト セットアップでジョブをインスタンス化しようとするとエラーが発生します。
com.google.inject.CreationException: Guice creation errors:
1) No implementation for javax.servlet.http.HttpServletRequest was bound.
while locating com.google.inject.Provider<javax.servlet.http.HttpServletRequest>
一方、モックインスタンスをバインドするだけの場合、たとえば
@Override
protected void configure() {
bind(HttpServletRequest.class).toInstance(mock(HttpServletRequest.class));
}
その後、ジョブをインスタンス化できますが、ジョブがサーブレット要求インスタンスを使用する場合にテスト エラーが発生しなくなりました。では、Guice がプロバイダーをインスタンス化できるようにバインディングを作成するにはどうすればよいでしょうか。ただし、プロバイダーの使用は失敗しますか?