Подтвердить что ты не робот

Spring - профиль по умолчанию для загрузки для тестов интеграции

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

  • Создать application-test.properties внутри src/main/resources
  • Напишите тестовую конфигурацию там (только имя базы данных)
  • В каждом тестовом файле:

    @ActiveProfiles("test")
    

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

Изменить 1: этот вопрос относится к Spring -Boot 1.4.1

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

@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 и т.д.).

Ответ 3

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

spring.profiles.active=test

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

Ответ 4

В моем случае у меня разные свойства 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" }), это файл, который отвечает за выбор приложений. Свойства, которые я хочу, в зависимости от моих потребностей для этих тестов

Ответ 5

Демонстрационный способ сделать это (на самом деле, незначительный твик к исходному ответу @Compito):

  1. Установите spring.profiles.active=test в test/resources/application-default.properties.
  2. Добавьте test/resources/application-test.properties для тестов и переопределите только те свойства, которые вам нужны.

Ответ 6

Еще один программный способ сделать это:

  import static org.springframework.core.env.AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME;

  @BeforeClass
  public static void setupTest() {
    System.setProperty(DEFAULT_PROFILES_PROPERTY_NAME, "test");
  }

Это прекрасно работает.

Ответ 7

Добавьте spring.profiles.active=tests в ваш файл application.properties, вы можете добавить несколько файлов свойств в ваше весеннее загрузочное приложение, таких как application-stage.properties, application-prod.properties и т.д. И вы можете указать это в своем application.properties файл в то время как файл для ссылки, добавив spring.profiles.active=stage или spring.profiles.active=prod

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

java -jar -Dspring.profiles.active=local build/libs/turtle-rnr-0.0.1-SNAPSHOT.jar

По имени профиля подбирается файл свойств, в указанном выше случае прохождение local профиля рассмотрим файл application-local.properties

Ответ 8

Для активации "тестового" профиля напишите в свой build.gradle:

    test.doFirst {
        systemProperty 'spring.profiles.active', 'test'
        activeProfiles = 'test'
    }

Ответ 9

Если вы используете maven, вы можете добавить это в pom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <argLine>-Dspring.profiles.active=test</argLine>
            </configuration>
        </plugin>
        ...

Затем maven должен запустить ваши интеграционные тесты (* IT.java), используя этот метод, а также IntelliJ начнет с активированным этим профилем - так что вы сможете указать все свойства внутри

application-test.yml

и вам не нужны свойства "-default".