Рубрики
Без рубрики

Переопределение свойств в тестах Spring

Изучите различные способы переопределения свойств в тестах Spring.

Автор оригинала: Łukasz Ryś.

1. Обзор

В этом уроке мы рассмотрим различные способы переопределения свойств в тестах Spring.

Весна на самом деле предоставляет ряд решений для этого, так что нам есть что изучить здесь.

2. Зависимости

Конечно, чтобы работать с весенними тестами, нам нужно добавить тестовую зависимость:


    org.springframework.boot
    spring-boot-starter-test
    2.4.0
    test

Эта зависимость также включает в себя Junit 5 для нас.

3. Настройка

Во-первых, нам нужно будет создать класс в приложении, который будет использовать наши свойства:

@Component
public class PropertySourceResolver {

    @Value("${example.firstProperty}") private String firstProperty;
    @Value("${example.secondProperty}") private String secondProperty;

    public String getFirstProperty() {
        return firstProperty;
    }

    public String getSecondProperty() {
        return secondProperty;
    }
}

Затем давайте присвоим им значения. Мы можем сделать это, создав application.properties в src/main/resources:

example.firstProperty=defaultFirst
example.secondProperty=defaultSecond

4. Переопределение файла свойств

Теперь мы переопределим свойства, поместив файл свойств в тестовые ресурсы. Этот файл должен находиться в том же пути к классу , что и файл по умолчанию.

Кроме того, он должен содержать все ключи свойств , указанные в файле по умолчанию. Поэтому мы добавим файл application.properties в файл src/test/resources :

example.firstProperty=file
example.secondProperty=file

Давайте также добавим тест, который будет использовать наше решение:

@SpringBootTest
public class TestResourcePropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldTestResourceFile_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals("file", firstProperty);
        assertEquals("file", secondProperty);
    }
}

Этот метод очень эффективен, когда мы хотим переопределить несколько свойств из файла.

И если бы мы не поместили свойство example.second в файл, контекст приложения не обнаружил бы это свойство.

5. Пружинные профили

В этом разделе мы узнаем, как решить нашу проблему с помощью профилей Spring. В отличие от предыдущего метода, этот метод объединяет свойства из файла по умолчанию и профилированного файла .

Во – первых, давайте создадим файл application test.properties в файле src/test/resources:

example.firstProperty=profile

После этого мы создадим тест, который будет использовать профиль test :

@SpringBootTest
@ActiveProfiles("test")
public class ProfilePropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldProfiledProperty_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals("profile", firstProperty);
        assertEquals("defaultSecond", secondProperty);
    }
}

Этот подход позволяет нам использовать как значения по умолчанию, так и тестовые значения. Поэтому это отличный метод, когда нам нужно переопределить несколько свойств из файла, но мы все равно хотим использовать по умолчанию.

Кроме того, мы можем узнать больше о профилях пружин в нашем учебнике по профилям пружин.

6. @Springboost

Другой способ переопределить значение свойства-использовать аннотацию @SpringBootTest :

@SpringBootTest(properties = { "example.firstProperty=annotation" })
public class SpringBootPropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldSpringBootTestAnnotation_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        Assert.assertEquals("annotation", firstProperty);
        Assert.assertEquals("defaultSecond", secondProperty);
    }
}

Как мы видим, Свойство example.first было переопределено, в то время как свойство example.second не было . Поэтому это отличное решение, когда нам нужно переопределить только определенные свойства для теста. Это единственный метод, который требует использования Spring Boot.

7. Utils TestPropertySource

В этом разделе мы узнаем, как переопределить свойства с помощью класса TestPropertySource Utils в ApplicationContextInitializer.

TestPropertySource Utils поставляется с двумя методами, которые мы можем использовать для определения другого значения свойства.

Давайте создадим класс инициализатора, который мы будем использовать в нашем тесте:

public class PropertyOverrideContextInitializer
  implements ApplicationContextInitializer {

    static final String PROPERTY_FIRST_VALUE = "contextClass";

    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
          configurableApplicationContext, "example.firstProperty=" + PROPERTY_FIRST_VALUE);

        TestPropertySourceUtils.addPropertiesFilesToEnvironment(
          configurableApplicationContext, "context-override-application.properties");
    }
}

Затем мы добавим файл context-override-application.properties в файл src/test/resources:

example.secondProperty=contextFile

Наконец, мы должны создать тестовый класс, который будет использовать наш инициализатор:

@SpringBootTest
@ContextConfiguration(
  initializers = PropertyOverrideContextInitializer.class,
  classes = Application.class)
public class ContextPropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldContext_overridePropertyValues() {
        final String firstProperty = propertySourceResolver.getFirstProperty();
        final String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals(PropertyOverrideContextInitializer.PROPERTY_FIRST_VALUE, firstProperty);
        assertEquals("contextFile", secondProperty);
    }
}

Свойство example.first было переопределено из метода online.

Свойство example.second было переопределено из конкретного файла во втором методе. Этот подход позволяет нам определять различные значения свойств при инициализации контекста.

8. Заключение

В этом уроке мы сосредоточились на нескольких способах, которые мы можем использовать для переопределения свойств в наших тестах.

Мы также выяснили, когда следует использовать каждый раствор или в некоторых случаях смешивать их.

Конечно, в нашем распоряжении также есть аннотация @TestPropertySource.

Как всегда, код для примеров доступен на GitHub .