При разработке на Spring Boot часто возникает необходимость переопределять конфигурационные свойства для тестов. Представим, что у нас есть
application.properties
в директории src/main/resources
со следующими свойствами:
spring.application.name=properties
spring.jpa.open-in-view=false
Мы хотим изменить
spring.application.name
и добавить новое свойство server.port
в тестах. Интуитивно разработчики создают application.properties
в src/test/resources
, ожидая, что он дополнит основной файл. Однако это не так (подробное объяснение можно найти здесь). Рассмотрим несколько способов переопределения свойств в тестах.1. @ActiveProfiles
Создайте файл
application-test.properties
в src/test/resources
и активируйте его в тестах.
@SpringBootTest
@ActiveProfiles("test")
class ActiveProfileTest {
@Autowired
private Environment env;
@Test
void test() {
Assertions.assertEquals("new-name", env.getProperty("spring.application.name"));
Assertions.assertEquals(false, env.getProperty("spring.jpa.open-in-view", Boolean.class));
Assertions.assertEquals(8099, env.getProperty("server.port", Integer.class));
}
}
2. Директория config
Spring загружает конфигурационные файлы в определенном порядке. Файлы в
src/test/resources/config
имеют приоритет и переопределяют свойства из src/main/resources
. Более подробно ознакомиться с тем, по какому принципу Spring загружает свойства можно в документации.3. @DynamicPropertySource
Используйте динамическую подмену свойств, если значения известны только во время выполнения.
@SpringBootTest
class DynamicPropertySourceTest {
@Autowired
private Environment env;
@DynamicPropertySource
static void properties(DynamicPropertyRegistry registry) {
registry.add("spring.application.name", () -> "new-name");
registry.add("server.port", () -> 8099);
}
@Test
void test() {
Assertions.assertEquals("new-name", env.getProperty("spring.application.name"));
Assertions.assertEquals(false, env.getProperty("spring.jpa.open-in-view", Boolean.class));
Assertions.assertEquals(8099, env.getProperty("server.port", Integer.class));
}
}
4. @TestPropertySource с параметром locations
Укажите путь к
*.properties
файлу с нужными значениями.
@SpringBootTest
@TestPropertySource(locations = "classpath:test.properties")
class PropertiesSourceLocationTest {
@Autowired
private Environment env;
@Test
void test() {
Assertions.assertEquals("new-name", env.getProperty("spring.application.name"));
Assertions.assertEquals(false, env.getProperty("spring.jpa.open-in-view", Boolean.class));
Assertions.assertEquals(8099, env.getProperty("server.port", Integer.class));
}
}
Продолжение в комментариях
#SpringBoot #SpringTips