Заменить 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>

и затем загрузите этот контекст тестового приложения в ваш тестовый набор. Теперь вы можете получить фиктивный бин из контекста приложения и передать его там, где это необходимо.

Другие вопросы по тегам