Вставка фиктивных бобов в весенний контекст для тестирования
Я знаю, что подобные вопросы задавались, например, здесь, но, выполнив поиск, я нашел решение, с которым я гораздо счастливее
Моя единственная проблема, однако, заключается в том, что я не уверен, как реализовать это решение.
То, что я хочу сделать, это через HotswappableTargetSource переопределить определения bean-компонентов select bean-компонентов в моем приложении с помощью тестовых версий, а затем запустить тест.
Затем для каждого тестового примера я хотел бы указать, какие бины я хочу иметь "горячей" заменой, а затем каждый тест должен иметь возможность создавать свои собственные фиктивные версии и обменивать их, а также иметь возможность снова менять их.
Я могу получить контекст приложения, с которым работает тест, но я не знаю, как настроить компонент для горячей замены. Я знаю, как это сделать при настройке bean-компонентов с помощью XML, но я не хочу возвращаться к использованию XML для настройки bean-компонентов.
1 ответ
ОБНОВЛЕНИЕ: есть библиотека, которая делает это!
https://bitbucket.org/kubek2k/springockito/wiki/springockito-annotations
Решение заключается в следующем:
Вам нужно будет изменить контекст Spring вашего приложения на прокси-компонент, который вы хотите поменять:
<bean id="beanSwappable" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource" ref="beanSwap" />
</bean>
<bean id="beanSwap" class="org.springframework.aop.target.HotSwappableTargetSource">
<constructor-arg ref="beanToSwap" />
</bean>
- beanSwap - это прокси на этот beanSwap.
- beanSwappable - это компонент, на который вы ссылаетесь, когда хотите поменять компонент.
- beanToSwap является реализацией bean-компонента по умолчанию
Таким образом, необходимо внести изменения в тестируемую систему.
И в вашем тесте код будет выглядеть так:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "test.xml", "spring.xml" })
public class Test {
@Resource(name="beanSwappable")
Bean b;
@Resource(name = "beanSwap")
HotSwappableTargetSource beanSwap;
public void swap() {
Bean b = << create mock version >>
beanSwap.swap(b);
// run test code which
}
}