2012-03-01 1 views
6

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

ответ

4

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

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

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

Это позволит вам переписать только те бобы, которые вы хотите заглушить/издеваться.

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

9

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

Например:

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

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

EDIT

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

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

См this section пружины документов для получения более подробной информации.

Есть несколько способов, чтобы установить активный профиль в производстве, но метод, который я использовал раньше находится в 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> 
+0

Где вы указать, какие 'Profile' вы используете в вашем тестовая конфигурация (или ваша производственная конфигурация)? –

+0

Я обновил свой ответ с помощью некоторых примеров, вы также можете использовать настройку профиля в вашем beans.xml, если вам нужно. – seanhodges

+0

+1 Спасибо! Очень хороший пример. –

 Смежные вопросы

  • Нет связанных вопросов^_^