[解決済み] Guiceでバインディングをオーバーライドする
質問
私はGuiceを使い始めたばかりですが、考えられる使用例としては、テストにおいて1つのバインディングを上書きしたいだけです。 私は、すべてが正しく設定されていることを確認し、重複を避けるために、残りの製品レベルのバインディングを使用したいと思います。
そこで、次のようなモジュールがあるとします。
public class ProductionModule implements Module {
public void configure(Binder binder) {
binder.bind(InterfaceA.class).to(ConcreteA.class);
binder.bind(InterfaceB.class).to(ConcreteB.class);
binder.bind(InterfaceC.class).to(ConcreteC.class);
}
}
そして、私のテストでは、InterfaceAとInterfaceBはそのままに、InterfaceCだけをオーバーライドしたいので、次のようなものが欲しいです。
Module testModule = new Module() {
public void configure(Binder binder) {
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(new ProductionModule(), testModule);
また、次のようなことも試してみましたが、うまくいきません。
Module testModule = new ProductionModule() {
public void configure(Binder binder) {
super.configure(binder);
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(testModule);
私の望むことが可能かどうか、または私が完全に間違った木に吠えているかどうか、誰か知っていますか?
--- フォローアップです。 インターフェイスの @ImplementedBy タグを使用して、テストケースでバインディングを提供すれば、私が望むことを実現できるようです。
また、同僚と話し合った結果、モジュール全体をオーバーライドして、モジュールが正しく定義されていることを確認する道を歩むことになりそうです。 この場合、バインディングがモジュール内で誤って配置され、移動する必要があるため、バインディングをオーバーライドすることができなくなり、多くのテストが壊れる可能性があると思われます。
解決方法は?
これはあなたが探している答えではないかもしれませんが、もしあなたがユニットテストを書いているのなら、おそらくインジェクタを使うべきでなく、むしろモックや偽のオブジェクトを手で注入すべきです。
一方、どうしても1つのバインディングを置き換えたい場合は
Modules.override(..)
:
public class ProductionModule implements Module {
public void configure(Binder binder) {
binder.bind(InterfaceA.class).to(ConcreteA.class);
binder.bind(InterfaceB.class).to(ConcreteB.class);
binder.bind(InterfaceC.class).to(ConcreteC.class);
}
}
public class TestModule implements Module {
public void configure(Binder binder) {
binder.bind(InterfaceC.class).to(MockC.class);
}
}
Guice.createInjector(Modules.override(new ProductionModule()).with(new TestModule()));
詳細を見る こちら .
のjavadocにあるように
Modules.overrides(..)
は、バインディングをオーバーライドする必要がないようにモジュールを設計することを推奨しています。この例では
InterfaceC
を別モジュールにする。
関連
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
サーブレットクラスのインスタンス化エラーの解決法
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
Javaエラーメッセージがenclosingクラスでない
-
org.glassfish.jersey.servlet.ServletContainer
-
HttpClientがGZIP形式でない場合の対処法
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
Javaエラーメッセージがenclosingクラスでない
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
java 例外。Javaツールの初期化
-
JSPで「リストが型解決できない!」の解決方法
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について