как переопределить один компонент, определенный в контексте приложения - PullRequest
6 голосов
/ 01 марта 2012

У меня есть веб-приложение, которое обращается к внешнему веб-сервису. Я пишу автоматизированный приемочный тестовый пакет для веб-приложения. Я не хочу вызывать внешний веб-сервис, поскольку он имеет серьезные накладные расходы, я хочу издеваться над этим веб-сервисом. Как этого добиться, не меняя контекст приложения веб-приложения? Мы недавно перешли на Spring 3.1, поэтому я испытываю желание использовать новые функции среды. Помогут ли эти новые функции переопределить этот единственный веб-сервис и оставить контекст приложения таким, какой он есть?

Ответы [ 2 ]

9 голосов
/ 01 марта 2012

Я бы использовал функцию Spring @ Profile , которая, как я полагаю, является "функциями среды", на которые вы ссылались.

Например:

@Service @Profile("dev")
public class FakeWebService implements WebService {
}

@Service @Profile("production")
public class ExternalWebService implements WebService {
}

РЕДАКТИРОВАТЬ

И указать, какой профиль использовать в своем тесте:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/app-config.xml")
@ActiveProfiles("dev")
public class MyAcceptanceTest {
}

См. этот раздел документов Spring для получения дополнительной информации.

Существует несколько способов установить активный профиль в рабочей среде, но метод, который я использовал ранее, находится в файле web.xml:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>production</param-value>
    </init-param>
</servlet>
4 голосов
/ 01 марта 2012

Я бы использовал BeanFactoryPostProcessor для этого, который зарегистрирован только в тестовых сценариях, которые вы хотите, чтобы это было смоделировано.

BeanFactoryPostProcessor позволяет вам изменять ПриложениеКонтекст сразу после его создания и заполнения.Вы можете найти имя вашего конкретного bean-компонента и зарегистрировать для него другой bean-компонент.

public class SystemTestBeanFactoryPostProcessor implements BeanFactoryPostProcessor
{
    @Override
    public void postProcessBeanFactory(final ConfigurableListableBeanFactory factory) throws BeansException
    {
        final MyInterface myInterface = new MyInterfaceStub();
        factory.registerSingleton("myInterfaceBeanName", myInterface);
    }
}

Это позволит вам перезаписывать только те bean-компоненты, которые вы хотите заглушить / mock.

Я не уверен, что это самый новый 3.x способ сделать это.Но это очень просто и легко реализовать.

...