次のように、Java ServiceLoader 仕様の一部として Hibernate Integrator を定義する Web アプリケーションがあります。
src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
# Define integrators that should be instantiated by the ServiceLoader
org.emmerich.MyIntegrator
これは、こちらの Hibernate ガイドに従って行われます。
私の問題は、単体テストを実行しようとすると、メインのインテグレーター記述子がまだ解析され、インスタンス化されていることです。これは、単体テストでアプリケーションの大部分をモックしているため、インテグレーターが実行しようとするとエラーが発生し、テストが失敗することを意味します。
テスト リソースで同じファイルを定義しました。
src/test/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
# Empty file to try and overwrite the main deployment description.
しかし、代わりに、テスト ファイルとメイン インテグレーター ファイルの両方が解析されていることがわかりました。
テスト リソースがメイン リソースを上書きし、メイン リソースが陳腐化することを期待していましたが、そうはなりませんでした。test-classes
両方のファイルがクラスパス上にあるため (クラスパスにとの両方を配置する Surefire-plugin を使用して、Maven を介してテストを実行していますclasses
)。と同様のことが起こりpersistence.xml
ます。
私の単体テスト環境では、これらの Bean の構築をできるだけ手動で制御したいので、インテグレーターをインスタンス化したくありません。私が実行単位をテストしていることを考えると、テストの実行に影響を与える可能性のあるインテグレーターなどの追加の Bean が横たわっていることは望ましくありません。これは、単体テスト中の完全に正当な要件だと思います。ただし、主要なリソースは引き続き によって解析されますがServiceLoader
、これは不可能です。
私がやろうとしている解決策は、persistence.xml
ここに投稿された解決策に基づいています。
ServiceLoader
私の質問は、特にファイルのコンテキストで、名前の変更を強制するよりも、単体テスト中に処理されないように主なリソースを除外するより良い方法があるかどうかです。
もう少しうまく要約するには:
クラスパスに同じサービス インターフェイスにちなんで名付けられた 2 つのファイルがある場合はどうなるでしょうか。私には、両方のファイル内のすべてのサービスがインスタンス化されているようです。上書きはないようです。