2015-10-19 6 views
17

Что я делаю неправильно? Я использую это небольшое автономное приложение, которое работает и находит мой src/main/resources/config/application.yml. Же конфигурация не работает от JUnit, смотри ниже:Свойства Spring Boot в '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 { 
    ... 
} 

ответ

22

Try это:

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

EDIT:

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

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

+0

Спасибо, это сработало! – aliopi

+0

Я использовал \ @ContextConfiguration вместо \ @SpringApplicationConfiguration и просто добавил поле инициализаторов, и это тоже сработало. Кажется, у меня нет SpringApplicationConfiguration в моем пути к классам. –

+0

@ k-den, вы, вероятно, уже используете Spring Boot 1.5.x, где SpringApplicationConfiguration удален (он устарел с версии 1.4.x). – luboskrnac

7

Вот еще один способ: [Весна Загрузочный 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.

e.g. maven project:

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

+0

спасибо! потратил впустую один день на это один :) +1 – Gadi

+1

Спасибо тонну! Он работал без application.properties в 1.4.3.RELEASE. У меня есть только application.yml по ресурсам. –

+0

Добро пожаловать :-) О, хорошо знать, что теперь это работает без «application.properties». Спасибо за информацию. –

3

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

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

обедненный вариант (withouth @SpringBootTest):

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

Но @SpringBootTest не приведет вас к тестированию UNIT, но больше тестов интеграции. – Yosh

+0

Это правда, но иногда я просто хочу видеть, что свойства загружаются. – aliopi

+1

'initializers = {ConfigFileApplicationContextInitializer.class}' это то, что я ищу! Благодарю. – gavenkoa

-1

Работает

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() { 
    } 

} 
0

В моем случае я пытался протестировать библиотеку без @SpringBootApp, объявленных в обычном пути к классам приложений, но у меня есть один в моем тестовом контексте. После отладки моего пути через процесс инициализации Spring Boot я обнаружил, что Spring Boot YamlPropertySourceLoader (начиная с 1.5.2.RELEASE) не будет загружать свойства YAML, если только org.yaml.snakeyaml.Yaml не находится в пути к классам. Решение для меня заключалось в том, чтобы добавить snakeyaml в качестве тестовой зависимости в моем POM:

<dependency> 
     <groupId>org.yaml</groupId> 
     <artifactId>snakeyaml</artifactId> 
     <version>1.19</version> 
     <scope>test</scope> 
    </dependency> 
Смежные вопросы