2014-12-09 6 views
8

Ciao Sto usando Spring Boot, voglio iniettare i valori del file .yml nel bean. Ho scritto il caso di test dell'integrazione, ma sembra che il test test di Integrazione non abbia iniettato i valori.Avvio a molla, leggere le proprietà yml tramite test case dell'integrazione

Il problema è che il valore di URL e keyspaceApp è nullo

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

Integrazione di prova caso

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

    @Autowired 
    private TestBean bean; 

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

di file yml Applicazione

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

risposta

8

Provate questo:

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

Dalle sue JavaDocs:

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

si dice che funziona con application.properties, ma credo che dovrebbe funzionare con application.yml pure.

9

Ecco come ho preso a lavorare:

@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

Ecco un altro modo: [Primavera Boot 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(); 
    } 
} 

Questo funziona solo se anche 'application.properties' il file esiste.

ad es. progetto Maven:

src/main/resources/application.properties [Il file può essere vuoto ma è obbligatorio!]
src/main/risorse/application.yml [ecco il vostro file di configurazione reale]

+0

La seconda annotazione può essere solo @SpringBootTest – hakamairi

3

Se si dispone di 'application-test.yml' nella cartella risorse.

Si può provare questo:

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

da esso è 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

Risparmiami un'ora, thnx. – Fire

0

SpringApplicationConfiguration è deprecato in primavera [Spring Boot v1.4.x] e rimosso in: [Spring Boot v1.5.x]. Quindi, questa è una risposta aggiornata.

MyTestClass classe è simile:

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 classe è simile:

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

mio application.yml è simile:

my: 
    property: Hello 

Infine MyConfiguration è davvero vuota :-) è possibile riempilo con quello che vuoi:

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

@Configuration 
@EnableConfigurationProperties(value = MyYmlProperties.class) 
public class MyConfiguration { 
} 
Problemi correlati