Загрузите другое приложение application.yml в тесте SpringBoot
Я использую приложение загрузки spring, которое запускает мой src/main/resources/config/application.yml.
Когда я запускаю свой тестовый сценарий:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class MyIntTest{
}
Коды тестов по-прежнему запускают мой файл application.yml для загрузки свойств.
Интересно, можно ли запустить другой файл *.yml при запуске тестового примера.
Ответы
Ответ 1
Один из вариантов - работать с профилями. Создайте файл с именем application-test.yml, переместите все свойства, необходимые для этих тестов, в этот файл, а затем добавьте аннотацию @ActiveProfiles
в тестовый класс:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@ActiveProfiles("test") // Like this
public class MyIntTest{
}
Имейте в виду, что он дополнительно загрузит application-test.yml, поэтому все свойства, которые находятся в application.yml, по-прежнему будут применяться. Если вы этого не хотите, используйте либо профиль для них, либо переопределите их в своем приложении-test.yml.
Ответ 2
Вы можете установить свои тестовые свойства в файле src/test/resources/config/application.yml
. Spring Загрузочные тестовые примеры будут принимать свойства из файла application.yml
в тесте.
Ответ 3
Вы можете использовать @TestPropertySource
для загрузки различных свойств/файла yaml
@TestPropertySource(locations="classpath:test.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class MyIntTest{
}
ИЛИ, если вы хотите переопределить только определенные свойства /yaml, вы можете использовать
@TestPropertySource(
properties = {
"spring.jpa.hibernate.ddl-auto=validate",
"liquibase.enabled=false"
}
)
Ответ 4
Смотрите это: Spring @PropertySource с помощью YAML
Я думаю, что у 3-го ответа есть то, что вы ищете, у меня есть отдельная POJO, чтобы отображать значения yaml в:
@ConfigurationProperties(path="classpath:/appprops.yml", name="db")
public class DbProperties {
private String url;
private String username;
private String password;
...
}
Затем аннотируйте свой тестовый класс следующим образом:
@EnableConfigurationProperties(DbProperties.class)
public class PropertiesUsingService {
@Autowired private DbProperties dbProperties;
}
Ответ 5
Если вам нужно полностью заменить производственный application.yml
поместите его тестовую версию по тому же пути, но в тестовой среде (обычно это src/test/resources/
)
Но если вам нужно переопределить или добавить некоторые свойства, у вас есть несколько вариантов.
Вариант 1: поместите test application.yml
в каталог src/test/resources/config/
как предполагает @TheKojuEffect в своем ответе.
Вариант 2: используйте специфичные для профиля свойства: создайте, скажем, application-test.yml
в вашей папке src/test/resources/
и:
-
добавьте аннотацию @ActiveProfiles
к своим тестовым классам:
@SpringBootTest(classes = Application.class)
@ActiveProfiles("test")
public class MyIntTest {
-
или альтернативно установите spring.profiles.active
свойства @SpringBootTest
аннотации @SpringBootTest
:
@SpringBootTest(
properties = ["spring.profiles.active=test"],
classes = Application.class,
)
public class MyIntTest {
Это работает не только с @SpringBootTest
но и с @JsonTest
, @JdbcTests
, @DataJpaTest
и другими аннотациями тестов срезов.
И вы можете установить столько профилей, сколько хотите (spring.profiles.active=dev,hsqldb
) - подробности см. В документации по профилям.
Ответ 6
Spring-boot Framework позволяет нам предоставлять YAML- файлы в качестве замены для файла .properties, и это удобно. Ключи в файлах свойств могут быть предоставлены в формате YAML в файле application.yml в папке ресурсов, и Spring-boot автоматически примет Помните, что формат yaml должен сохранять правильные пробелы для правильного чтения значения.
Вы можете использовать @Value("${property}")
для вставки значений из файлов YAML. Также можно указать Spring.active.profiles, чтобы различать разные YAML для разных сред для удобного развертывания.
Для тестирования тестовый файл yaml может иметь имя, подобное application-test.yml, и помещаться в папку ресурсов в тестовом каталоге.
Если вы указываете applciation-test.yml
и предоставляете профиль весеннего теста в yml, то вы можете использовать @ActiveProfiles('test')
чтобы @ActiveProfiles('test')
пружине получать конфигурации из файла application-test.yml, который у вас есть. указано.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationTest.class)
@ActiveProfiles("test")
public class MyTest {
...
}
Если вы используете JUnit 5, другие аннотации не нужны, так как @SpringBootTest уже содержит аннотацию springrunner. Сохранение отдельного основного ApplicationTest.class позволяет нам предоставлять отдельные классы конфигурации для тестов, и мы можем предотвратить загрузку компонентов конфигурации по умолчанию, исключив их из проверки компонентов в основном классе теста. Вы также можете предоставить профиль для загрузки там.
@SpringBootApplication(exclude=SecurityAutoConfiguration.class)
public class ApplicationTest {
public static void main(String[] args) {
SpringApplication.run(ApplicationTest.class, args);
}
}
Вот ссылка на документацию Spring относительно использования YAML вместо файла .properties
: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config. HTML
Ответ 7
Начиная с Spring 4.1, мы можем напрямую установить свойство в application.yml, используя аннотацию @TestPropertySource.
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = {"yoursection.yourparameter=your_value"})
public MyIntTest
{
//your test methods
}
Просто преобразуйте параметры yaml в полную структуру свойств. Например: если содержимое application.yml похоже ниже
yoursection:
yourparameter:your_value
Тогда значение для входа в источник @TestPropertySource будет,
yoursection.yourparameter=your_value
Ответ 8
Мы можем использовать аннотацию @SpringBootTest, которая загружает yml файл из src\main\java\com... поэтому при выполнении модульного теста все свойства уже присутствуют в классе свойств конфигурации.
@RunWith(SpringRunner.class)
@SpringBootTest
public class AddressFieldsTest {
@InjectMocks
AddressFieldsValidator addressFieldsValidator;
@Autowired
AddressFieldsConfig addressFieldsConfig;
...........
@Before
public void setUp() throws Exception{
MockitoAnnotations.initMocks(this);
ReflectionTestUtils.setField(addressFieldsValidator,"addressFieldsConfig", addressFieldsConfig);
}
}
Мы можем использовать аннотацию @Value, если у вас мало конфигураций или других мудрых мы можем использовать класс свойств конфигурации. Например, для
@Data
@Component
@RefreshScope
@ConfigurationProperties(prefix = "address.fields.regex")
public class AddressFieldsConfig {
private int firstName;
private int lastName;
.........
Ответ 9
Это может считаться одним из вариантов. Теперь, если вы хотите загрузить файл yml (который не был загружен по умолчанию при применении вышеупомянутых аннотаций), хитрость заключается в использовании
@ContextConfiguration(classes= {...}, initializers={ConfigFileApplicationContextInitializer.class})
Вот пример кода
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@DirtiesContext
@ContextConfiguration(classes= {DataSourceTestConfig.class}, initializers = {ConfigFileApplicationContextInitializer.class})
public class CustomDateDeserializerTest {
private ObjectMapper objMapper;
@Before
public void setUp() {
objMapper = new ObjectMapper();
}
@Test
public void test_dateDeserialization() {
}
}
Снова убедитесь, что установочный конфигурационный java файл - здесь DataSourceTestConfig.java
содержит следующие значения свойств.
@Configuration
@ActiveProfiles("test")
@TestPropertySource(properties = { "spring.config.location=classpath:application-test.yml" })
public class DataSourceTestConfig implements EnvironmentAware {
private Environment env;
@Bean
@Profile("test")
public DataSource testDs() {
HikariDataSource ds = new HikariDataSource();
boolean isAutoCommitEnabled = env.getProperty("spring.datasource.hikari.auto-commit") != null ? Boolean.parseBoolean(env.getProperty("spring.datasource.hikari.auto-commit")):false;
ds.setAutoCommit(isAutoCommitEnabled);
// Connection test query is for legacy connections
//ds.setConnectionInitSql(env.getProperty("spring.datasource.hikari.connection-test-query"));
ds.setPoolName(env.getProperty("spring.datasource.hikari.pool-name"));
ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
long timeout = env.getProperty("spring.datasource.hikari.idleTimeout") != null ? Long.parseLong(env.getProperty("spring.datasource.hikari.idleTimeout")): 40000;
ds.setIdleTimeout(timeout);
long maxLifeTime = env.getProperty("spring.datasource.hikari.maxLifetime") != null ? Long.parseLong(env.getProperty("spring.datasource.hikari.maxLifetime")): 1800000 ;
ds.setMaxLifetime(maxLifeTime);
ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
ds.setPoolName(env.getProperty("spring.datasource.hikari.pool-name"));
ds.setUsername(env.getProperty("spring.datasource.username"));
ds.setPassword(env.getProperty("spring.datasource.password"));
int poolSize = env.getProperty("spring.datasource.hikari.maximum-pool-size") != null ? Integer.parseInt(env.getProperty("spring.datasource.hikari.maximum-pool-size")): 10;
ds.setMaximumPoolSize(poolSize);
return ds;
}
@Bean
@Profile("test")
public JdbcTemplate testJdbctemplate() {
return new JdbcTemplate(testDs());
}
@Bean
@Profile("test")
public NamedParameterJdbcTemplate testNamedTemplate() {
return new NamedParameterJdbcTemplate(testDs());
}
@Override
public void setEnvironment(Environment environment) {
// TODO Auto-generated method stub
this.env = environment;
}
}
Ответ 10
Простая рабочая конфигурация с использованием
@TestPropertySource и свойства
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {"spring.config.location=classpath:another.yml"})
public class TestClass {
@Test
public void someTest() {
}
}