Spring Tips: Переопределение и дополнение свойств для Spring Boot тестов



При разработке на 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