У меня есть веб-приложение, которое определяет интегратор Hibernate как часть спецификации Java ServiceLoader, например:
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.
но вместо этого я обнаружил, что анализируются как тестовые, так и основные файлы интегратора.
Я ожидал, что тестовый ресурс перезапишет основной ресурс, тем самым отрисовав основной ресурс obscolete, но это не то, что происходит. Поскольку оба файла находятся в пути к классам (я запускаю тесты через Maven с плагином surefire, который помещает как test-classes
, так и classes
в путь к классам). То же самое и с persistence.xml
.
В моей среде модульного тестирования я не хочу, чтобы какие-либо интеграторы создавались, потому что я хочу управлять построением этих bean-компонентов как можно более вручную. Учитывая, что я тестирую единицы выполнения, мне не нужны дополнительные bean-компоненты, такие как интеграторы, которые могут повлиять на выполнение тестов. Я считаю, что это вполне законное требование во время модульного тестирования. Однако, хотя основные ресурсы все еще анализируются ServiceLoader
, это невозможно.
Решение, к которому я пришел, основано на решении persistence.xml
, опубликованном здесь:
Как настроить JPA для тестирования в Maven
Мой вопрос: есть ли лучший способ исключить основные ресурсы из обработки во время модульного тестирования, чем принудительное переименование, особенно в контексте ServiceLoader
файлов?
Чтобы попытаться резюмировать это немного лучше:
Что произойдет, если у вас есть два файла, названные в честь одного и того же интерфейса службы в пути к классам? Мне кажется, что все службы в обоих файлах созданы. Перезаписи вроде бы нет.