Замяна на свойствата в пробните тестове

1. Общ преглед

В този урок ще разгледаме различни начини за замяна на свойствата в тестовете на Spring.

Spring всъщност предоставя редица решения за това, така че имаме доста да изследваме тук.

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

Разбира се, за да работим с пробни тестове, трябва да добавим тестова зависимост:

 org.springframework.boot spring-boot-starter-test 2.1.6.RELEASE test 

В пролетно-обувка стартер тест зависимостта съдържа всичко, което трябва да замени стойността на имота в тестовете.

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

Нека добавим и теста, който ще използва нашето решение:

@RunWith(SpringRunner.class) @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

След това ще създадем тест, който ще използва тестовия профил:

@RunWith(SpringRunner.class) @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 :

@RunWith(SpringRunner.class) @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 { 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

И накрая, трябва да създадем тестов клас, който ще използва нашия инициализатор:

@RunWith(SpringRunner.class) @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 е подтиснат от inlined метод.

В example.secondProperty е подтиснат от специфичния файл във втория метод. Този подход ни позволява да дефинираме различни стойности на свойствата при инициализиране на контекста.

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

В този урок се фокусирахме върху многобройните начини, които можем да използваме, за да заменим свойствата в нашите тестове.

Също така открихме кога да използваме всяко решение или в някои случаи кога да ги смесваме.

Ние, разбира се, разполагаме и с анотацията @TestPropertySource .

Както винаги, кодът за примери е достъпен в GitHub.