Перейти к основному содержимому

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

· 4 мин. чтения

1. Обзор

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

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

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

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.6.1</version>
<scope>test</scope>
</dependency>

Эта зависимость также включает в себя 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.secondProperty , контекст приложения не обнаружит это свойство.

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

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

Для начала создадим приложение — файл test.properties в папке src/test/resources:

example.firstProperty=profile

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

@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);
}
}

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

Мы можем узнать больше о профилях Spring в нашей статье Spring Profiles .

6. @SpringBootTest

Другой способ переопределить значение свойства — использовать аннотацию @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.firstProperty было переопределено, а свойство example.secondProperty — нет . Поэтому это отличное решение, когда нам нужно переопределить только определенные свойства для теста. Это единственный метод, требующий использования Spring Boot.

7. TestPropertySourceUtils

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

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

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

public class PropertyOverrideContextInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {

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.firstProperty было переопределено из встроенного метода.

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

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

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

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

Как всегда, код примеров из этой статьи доступен на GitHub .