В наших веб-приложениях Spring мы используем профили Spring bean для дифференциации трех сценариев: разработки, интеграции и производства. Мы используем их для подключения к различным базам данных или для установки других констант.
Использование профилей Spring bean очень хорошо работает для изменения среды веб-приложения.
Проблема заключается в том, что нам необходимо изменить код интеграции для среды. В этих случаях интеграционный тест загружает контекст приложения веб-приложения. Таким образом, нам не нужно переопределять соединения с базой данных, константы и т.д. (Применяя принцип DRY).
Мы устанавливаем наши интеграционные тесты следующим образом.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
public class MyTestIT
{
@Autowired
@Qualifier("myRemoteURL") // a value from the web-app applicationContext.xml
private String remoteURL;
...
}
Я могу запустить его локально с помощью @ActiveProfiles
, но это жестко закодировано и приводит к сбою наших тестов на сервере сборки.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
@ActiveProfiles("development")
public class MyTestIT
{ ... }
Я также попытался использовать @WebAppConfiguration
, надеясь, что он каким-то образом может импортировать свойство spring.profiles.active
из Maven, но это не работает.
Еще одно замечание, нам также необходимо настроить наш код, чтобы разработчики могли запускать веб-приложение, а затем запускать тесты с помощью тестового бегуна IntelliJ (или другой среды IDE). Это намного проще для отладки тестов интеграции.