У меня есть приложение SpringBoot в main / java с тестами в тесте / java. Некоторые из тестов помечены @SpringBootTest
.
Некоторые из классов в приложении имеют ссылку на поле для объекта «Менеджер». Поле подключено автоматически. Он не является простотой в качестве прототипа и поэтому является синглтоном.
Когда я запускаю тесты (я использую gradle), я вижу, что объект Manager создается дважды в одном и том же процессе, что стало неожиданностью.
Возможное объяснение этого состоит в том, что каждое @SpringBootTest
тестовое устройство представляет приложение, работающее как тест, и, следовательно, для каждого тестового устройства Spring Boot создает все зависимости, необходимые с нуля.
Это будетбыть разумным поведением, потому что ни один из тестов в одном приборе не тестирует доступ в другом осветителе, поэтому для всех намерений и целей может показаться, что одноэлементный контракт был соблюден.
Проблема, однако, заключается в том, что все тестовые приборысоздаются в том же процессе. Поэтому любая работа в рамках всего процесса, выполняемая при создании синглтона, оставляет побочные эффекты для следующего теста.
В частности, мой диспетчер-одиночка добавляет пользовательский Appender к корневому логгеру входа в систему. Когда выполняются тесты во втором тестовом устройстве, каждое сообщение журнала выдается дважды.
Если предположить, что такое поведение следует ожидать, какова наилучшая практика для предотвращения таких побочных эффектов. Если этого не следует ожидать, может кто-нибудь сказать мне, что мне нужно сделать, чтобы в процессе оставались одиночные одиночные автопроводки?