Spring Свойства загрузки в 'application.yml' не загружаются с JUnit Test

Что я делаю неправильно? Я использую это небольшое автономное приложение, которое запускается и находит мой src/main/resources/config/application.yml. Такая же конфигурация не работает с JUnit, см. Ниже:

@Configuration
@ComponentScan
@EnableConfigurationProperties

public class TestApplication {

    public static void main(String[] args) {

        SpringApplication.run(TestApplication.class);
    }
}


@Component
@ConfigurationProperties

public class Bean{
    ...
}

Следующие действия не работают, те же свойства в application.yml не загружаются, а Bean имеет только null значения:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)

public class SomeTestClass {
    ...
}

Ответы

Ответ 1

Попробуйте следующее:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
public class SomeTestClass {
    ...
}

ИЗМЕНИТЬ

Для Spring Загрузочная версия 1.5+, SpringApplicationConfiguration была удалена в пользу SpringBootTest или прямого использования SpringBootContextLoader.

Вы можете использовать параметр initializers с аннотацией ContextConfiguration.

Ответ 2

Здесь другой способ: [ Spring Boot v1.4.x]

@Configuration
@ConfigurationProperties(prefix = "own")
public class OwnSettings {

    private String name;
    Getter & setters...

}

import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@BootstrapWith(SpringBootTestContextBootstrapper.class)
public class OwnSettingsTest {

  @Autowired
  private OwnSettings bean;

  @Test
  public void test() {
    bean.getName();
  }
}

Это работает ТОЛЬКО, если также существует файл 'application.properties'.

например. Проект maven:

src/main/resources/application.properties [ Файл может быть пустым, но обязательно!]
src/main/resources/application.yml [здесь ваш реальный файл конфигурации]

Ответ 3

Альтернатива в феврале 2017 года:

@SpringBootTest
@ContextConfiguration(classes = { TestApplication.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
   ...
}

скудный вариант (с тегом @SpringBootTest):

@ContextConfiguration(classes = { TestApplication.class },
                 initializers = { ConfigFileApplicationContextInitializer.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {

Ответ 4

Это работает

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTest {

    @Test
    public void contextLoads() {
    }

}