Заменить Spring Bean в одном контексте на фиктивную версию из другого контекста
Я пишу интеграционный тест, где контекст приложения xml инициализируется во время запуска. В классе тестирования есть несколько методов тестирования, которые используют конкретный компонент 'X'(уже определенный в xml). Мое действительное требование состоит в том, чтобы макетировать bean X только для одного из методов тестирования.
Внутри тестового метода: я попытался создать отдельный контекст приложения, используя ClassPathXMLApplicationContext только с ложным компонентом "M".
Теперь у меня есть два контекста приложения (AC): 1. Один создан во время запуска тестового примера (который содержит фактический компонент X) и 2. Один создан с использованием ClassPathXMLApplicationContext в методе теста (который имеет фиктивный компонент M).
Я хочу заменить фактическое определение bean-компонента 'X' в AC:1, используя определение фиктивного bean-компонента 'M' из AC:2.
Может кто-нибудь пролить свет на это, пожалуйста?
3 ответа
Не существует четкого способа заменить боб в обновленном виде. ApplicationContext
если вы не закроете его и не обновите снова.
Чтобы подражать этому, общий подход заключается в использовании Proxy
боба, который вы хотите заменить и изменить цель во время выполнения.
Вы можете сделать это легко с помощью фреймворка AOP Support Class:
<bean id="realBean" class="RealClass" />
<bean id="mockBean" class="MockClass" />
<bean id="targetSource" class="org.springframework.aop.target.HotSwappableTargetSource">
<constructor-arg ref="realBean" />
</bean>
<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource" ref="targetSource" />
</bean>
@Test
public void testWithMockBean() {
Object real = targetSource.swap(mock);
....
// do your test work
...
targetSource.swap(real);
}
Вы можете:
- используйте аннотацию профиля, если у вас есть пружина 3.1.
- используйте Первичную аннотацию
- использовать классификаторы
- провод боб самостоятельно в контексте весны
и я уверен, что есть еще больше вариантов.
Создайте testApplicationContext с помощью
<beans>
<import resource="classpath*:appContext.xml" />
<bean id="mockbeanOfX" class=....../>
</beans>
и затем загрузите этот контекст тестового приложения в ваш тестовый набор. Теперь вы можете получить фиктивный бин из контекста приложения и передать его там, где это необходимо.