Загрузите другое приложение 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() {
    }
}