Должен ли Spring-Boot-Test @MockBeans соответствовать условиям @ConditionalOnBean?
У меня есть ява @Configuration
класс с FOO @Bean
с пометкой @ConditionalOnBean(BAR.class).
Поскольку я ожидаю, что этот bean-компонент будет предоставлен или не предоставлен проектом импорта, его нет нигде в моем проекте.
В моем интеграционном тесте я издеваюсь Bar.class
посредством @MockBeans
, Но по какой-то причине Spring-Boot -debug сообщает, что не нашел его, поэтому мой условный компонент не был загружен.
Я почти уверен, что эта ситуация работала должным образом в прошлом, но я настраивал что-нибудь дополнительное? Я не могу заставить это работать
PS> Я обнаружил, что ручная перерегистрация @Bean в той же @Configuration, что и условная, тоже не видит! Есть ли известная ошибка, связанная с его?
Автоответчик: виновник в этом случае
Вы должны быть очень осторожны с порядком добавления определений бина, поскольку эти условия оцениваются на основе того, что было обработано до сих пор. По этой причине мы рекомендуем использовать только аннотации @ConditionalOnBean и @ConditionalOnMissingBean в классах автоконфигурации (поскольку они гарантированно загружаются после добавления любых определенных пользователем определений компонентов).
P.S2> Я понял, что Bar.class - это интерфейс, но я не понимаю, почему он не должен работать, пока присутствует реализация
P.S3> Я обнаружил, что MockitoTestExecutionListener выполняется после класса OnBeanCondition. Это кажется моей проблемой полностью.
1 ответ
Это и это объясняют, почему это невозможно: