2014-12-09 2 views
8

Привет, я использую Spring Boot, я хочу вставлять значения .yml-файла в Bean. Я написал тестовый пример интеграции, но, похоже, с помощью теста интеграции, он не вводит значения.Весенняя загрузка, чтение свойств yml с помощью тестового примера интеграции

Проблема значение адреса и keyspaceApp является нулевым

Bean

@ConfigurationProperties(prefix="cassandra") 
public class TestBean { 

    @Value("${urls}") 
    private String urls; 

    @Value("${keyspaceApp}") 
    private String app; 

    public void print() { 
     System.out.println(urls); 
     System.out.println(app); 
    } 

    public String getUrls() { 
     return urls; 
    } 

    public void setUrls(String urls) { 
     this.urls = urls; 
    } 
} 

Интеграция Тестовый случай

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = TestBean.class) 
@IntegrationTest 
public class CassandraClientTest { 

    @Autowired 
    private TestBean bean; 

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

YML Применение файла

cassandra: 
    urls: lllaaa.com 
    keyspaceApp: customer 
    createDevKeyspace: true 

ответ

8

Попробуйте это:

@SpringApplicationConfiguration(classes = TestBean.class, initializers = ConfigFileApplicationContextInitializer.class) 

С его JavaDocs:

* {@link ApplicationContextInitializer} that can be used with the 
* {@link ContextConfiguration#initializers()} to trigger loading of 
* {@literal application.properties}. 

Он говорит, что он работает с application.properties, но я думаю, он должен работать с application.yml, а также.

9

Вот как я получил его на работу:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(initializers=ConfigFileApplicationContextInitializer.class) 
public class MyTestClass { 

    @Autowired 
    private ConfigurableApplicationContext c; 

    @Test 
    public void myTestMethod() {    
    String value = c.getEnvironment().getProperty("myapp.property") 
    ... 
    } 
} 
0

Вот еще один способ: [Весна Загрузочный v1.4.x]

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

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

    @Autowired 
    private TestBean bean; 

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

Это работает только если также 'application.properties' Файл существует.

e.g. maven project:

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

+0

Вторая аннотация может быть просто @SpringBootTest – hakamairi

3

Если у вас есть 'приложение-test.yml' в папке ресурсов.

Вы можете попробовать это:

import org.springframework.test.context.ActiveProfiles; 
@ActiveProfiles("test") 

От него это Java Docs:

* {@code ActiveProfiles} is a class-level annotation that is used to declare 
* which <em>active bean definition profiles</em> should be used when loading 
* an {@link org.springframework.context.ApplicationContext ApplicationContext} 
* for test classes. 
* 
* <p>As of Spring Framework 4.0, this annotation may be used as a 
* <em>meta-annotation</em> to create custom <em>composed annotations</em>. 
+1

Сохраните мне час, thnx. – Fire

0

SpringApplicationConfiguration осуждается весной [Весна Загрузочный v1.4.x] и удалены: [Spring Boot v1.5.x]. Итак, это обновленный ответ.

MyTestClass класс как:

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringRunner; 
import static org.assertj.core.api.Assertions.assertThat; 

@RunWith(SpringRunner.class) 
@ContextConfiguration(classes = MyConfiguration.class, initializers = ConfigFileApplicationContextInitializer.class) 
public class MyTestClass { 
    @Autowired 
    private MyYmlProperties myYmlProperties; 

    @Test 
    public void testSpringYmlProperties() { 
     assertThat(myYmlProperties.getProperty()).isNotEmpty(); 
    } 
} 

MyYmlProperties класс как:

import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ConfigurationProperties(prefix = "my") 
public class MyYmlProperties { 
    private String property; 
    public String getProperty() { return property; } 
    public void setProperty(String property) { this.property = property; } 
} 

Мои application.yml, как:

my: 
    property: Hello 

Наконец MyConfiguration действительно пуст :-) Вы можете заполните его тем, что вы хотите:

Смежные вопросы