2014-12-09 6 views
8

Hallo Ich benutze Spring Boot, ich möchte die Werte der .yml-Datei in die Bean injizieren. Ich habe den Integrationstest-Fall geschrieben, aber es sieht so aus, als würde der Integrationstest die Werte nicht einspeisen.Spring Boot, lies yml Eigenschaften über Integration Testfall

Problem ist Wert von Urls und keyspaceApp ist null

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; 
    } 
} 

Fall Integrationstest

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

    @Autowired 
    private TestBean bean; 

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

Anwendung yml Datei

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

Antwort

8

Versuchen Sie dieses:

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

Von seiner JavaDocs:

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

Er sagt, dass es mit application.properties funktioniert, aber ich denke, es sollte auch mit application.yml arbeiten.

9

Hier ist, wie ich es an die Arbeit:

@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

Hier ist eine andere Art und Weise: [Frühling Stiefel 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(); 
    } 
} 

dies nur, wenn auch 'application.properties' funktioniert Datei existiert.

z.B. Maven Projekt:

src/main/resources/application.properties [Die Datei kann leer sein, aber es ist zwingend erforderlich!]
src/main/resources/application.yml [hier ist Ihre echte Konfigurationsdatei]

+0

Die zweite Anmerkung kann nur sein @SpringBootTest – hakamairi

3

Wenn Sie 'anwendungs ​​test.yml' in Ressourcen Ordner.

Sie können dies versuchen:

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

Von es ist 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

Rette mich eine Stunde, Thnx. – Fire

0

SpringApplicationConfiguration im Frühjahr veraltet [Frühling Stiefel v1.4.x] und entfernt in: [Frühlingsstiefel v1.5.x]. Also, das ist eine aktualisierte Antwort.

MyTestClass Klasse ist wie:

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 Klasse ist wie:

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; } 
} 

Mein application.yml ist wie:

my: 
    property: Hello 

MyConfiguration Schließlich ist wirklich leer :-) können Sie füllen Sie es mit was Sie wollen:

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

@Configuration 
@EnableConfigurationProperties(value = MyYmlProperties.class) 
public class MyConfiguration { 
} 
Verwandte Themen