вставка фиктивных бобов в контекст весны для тестирования - PullRequest
8 голосов
/ 25 ноября 2010

Я знаю, что подобные вопросы задавались, например, здесь , но, выполнив поиск, я нашел решение, с которым мне гораздо приятнее здесь

Моя единственная проблема, однако, заключается в том, что я не уверен, как реализовать это решение.

То, что я хочу сделать, - это через HotswappableTargetSource переопределить определения bean-компонентов select bean-компонентов в моем приложении с помощью тестовых версий, а затем запустить тест.

Затем для каждого теста я хотел бы указать, какие бины я хочу иметь «горячей» заменой, а затем каждый тест должен иметь возможность создавать свои собственные фиктивные версии, менять их местами и иметь возможность снова менять их. *

Мне удалось получить контекст приложения, с которым выполняется тест, но я не знаю, как настроить компонент для горячей замены. Я знаю, как это сделать при настройке bean-компонентов с xml, но я не хочу возвращаться к использованию xml для настройки bean-компонентов.

1 Ответ

9 голосов
/ 29 ноября 2010

ОБНОВЛЕНИЕ: есть библиотека, которая делает это!

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 - это bean-компонент, на который вы ссылаетесь, когда хотите поменять bean-компонент
  • 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

    }
}
...