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 .