2016-09-25 1 views
22

Весенняя обувь использует профили пружины (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html), которые позволяют, например, иметь отдельную конфигурацию для разных сред. Одним из способов использования этой функции является настройка тестовой базы данных, которая будет использоваться интеграционными тестами. Интересно, однако, нужно ли создать мой собственный профиль 'test' и явно активировать этот профиль в каждом тестовом файле? Прямо сейчас я делаю это следующим образом:Весна-загрузочный профиль по умолчанию для тестов интеграции

  1. Создание application-test.properties внутри SRC/основные/ресурсы
  2. Написать тест конкретные конфигурации есть (только имя базы данных в настоящее время)
  3. В каждый тестовый файл включают в себя:

    @ActiveProfiles("test") 
    

есть ли умнее/более краткий путь? Например, тестовый профиль по умолчанию?

Edit 1: Этот вопрос относится к Spring-Boot 1.4.1

ответ

33

Насколько я знаю, там ничего непосредственно адресацию ваш запрос - но я могу предложить предложения, которые могли бы помочь.

Вы можете использовать собственную тестовую аннотацию, которая представляет собой meta annotation, содержащую @SpringBootTest и @ActiveProfiles("test"). Таким образом, вам по-прежнему нужен специальный профиль, но избегайте рассеивания определения профиля во всем тесте.

Эта аннотация по умолчанию будет проверяться профилем, и вы можете переопределить профиль, используя мета-аннотацию.

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@SpringBootTest 
@ActiveProfiles 
public @interface MyApplicationTest { 
    @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"}; 
} 
6

Вы можете поместить файл application.properties в свою папку test/resources. Там вы установили

spring.profiles.active=test 

Это типичный тестовый профиль при выполнении тестов.

+0

Я использую эту запись в моих тестовых таблицах, если я хочу избежать установки @ActiveProfiles («test»). Разве это не работает для вас? – Compito

+9

Если я создаю файл 'src/test/resources/application.properties', содержимое' src/main/resources/application.properties' игнорируется при выполнении тестов. – ciastek

19

Другой способ сделать это состоит в определении базы (аннотация) тестового класса, что фактические классы тестов продлит:

@RunWith(SpringRunner.class) 
@SpringBootTest() 
@ActiveProfiles("staging") 
public abstract class BaseIntegrationTest { 
} 

Бетон тест:

public class SampleSearchServiceTest extends BaseIntegrationTest{ 

    @Inject 
    private SampleSearchService service; 

    @Test 
    public void shouldInjectService(){ 
     assertThat(this.service).isNotNull(); 
    } 
} 

Это позволяет извлечь больше чем просто аннотация @ActiveProfiles. Вы могли бы также представить более специализированные базовые классы для различных видов интеграционных тестов, например. уровень доступа к данным и уровень обслуживания, или для функциональных специальностей (общие методы @Before или @After и т. д.).

-1

В моем случае у меня есть разное application.properties в зависимости от окружающей среды, что-то вроде:

application.properties (base file) 
application-dev.properties 
application-qa.properties 
application-prod.properties 

и application.properties содержит свойство spring.profiles.active, чтобы выбрать правильный файл.

Для моих тестов интеграции, я создал новый application-test.properties файл внутри test/resources и с @TestPropertySource({ "/application-test.properties" }) аннотацию это файл, который отвечает за сбор за application.properties я хочу в зависимости от моих потребностей для этих тестов

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