У меня есть веб-приложение, которое обращается к внешней веб-службе. Я пишу автоматизированный набор приемочных тестов для веб-приложения. Я не хочу ссылаться на внешний веб-сервис, поскольку он имеет серьезные накладные расходы, я хочу издеваться над этим веб-сервисом. Как это может произойти без изменения контекста приложения веб-приложения? Недавно мы перешли на Spring 3.1, поэтому у меня возникли соблазн использовать новые функции среды. Новая функция поможет мне переопределить этот единственный веб-сервис и оставить контекст приложения таким, какой он есть?как переопределить один компонент, определенный в контексте приложения
ответ
Я бы использовал 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» для выполнения такого рода вещей. Но это очень просто и легко реализовать.
Я бы использовал функцию 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>
Где вы указать, какие 'Profile' вы используете в вашем тестовая конфигурация (или ваша производственная конфигурация)? –
Я обновил свой ответ с помощью некоторых примеров, вы также можете использовать настройку профиля в вашем beans.xml, если вам нужно. – seanhodges
+1 Спасибо! Очень хороший пример. –