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 .