it-swarm.com.de

Spring Boot-Eigenschaften in 'application.yml' werden nicht von JUnit Test geladen

Was mache ich falsch? Ich benutze diese kleine Standalone-App, die meinen src/main/resources/config/application.yml ausführt und findet. Dieselbe Konfiguration funktioniert nicht mit JUnit, siehe unten:

@Configuration
@ComponentScan
@EnableConfigurationProperties

public class TestApplication {

    public static void main(String[] args) {

        SpringApplication.run(TestApplication.class);
    }
}


@Component
@ConfigurationProperties

public class Bean{
    ...
}

Folgendes funktioniert nicht, die gleichen Eigenschaften in application.yml werden nicht geladen und Bean hat nur null-Werte:

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

public class SomeTestClass {
    ...
}
30
aliopi

Versuche dies:

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

EDIT:

Bei Spring Boot Version 1.5+ wurde SpringApplicationConfiguration zugunsten von SpringBootTest oder der direkten Verwendung von SpringBootContextLoader entfernt. 

Sie können den Parameter initializers weiterhin mit der Annotation ContextConfiguration verwenden.

35
luboskrnac

Hier ist ein anderer Weg: [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();
  }
}

Dies funktioniert NUR, wenn auch die Datei 'application.properties' vorhanden ist.

z.B. Maven-Projekt:

src/main/resources/application.properties [ Die Datei kann leer sein, ist aber obligatorisch! ]
src/main/resources/application.yml [hier ist Ihre eigentliche Konfigurationsdatei]

8
Juha Hanka

Alternative im Februar 2017:

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

die schlanke Variante (ohne @SpringBootTest):

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

Der Trick zum Laden von any custom yml-Dateien in SpringBoot 2.0 ohne Verwendung von @SpringBootTest

  • erstellen Sie eine Yml-Datei in test\resources
  • Verwenden Sie die ConfigFileApplicationContextInitializer- und spring.config.location-Eigenschaft

Beispielcode:

@RunWith(SpringRunner.class)
@ContextConfiguration(
    classes = { MyConfiguration.class, AnotherDependancy.class },
    initializers = {ConfigFileApplicationContextInitializer.class} )
@TestPropertySource(properties = { "spring.config.location=classpath:myApp-test.yml" })
public class ConfigProviderTest {
    @Autowired
    private MyConfiguration myConfiguration; //this will be filled with myApp-test.yml 

   @Value("${my.config-yml-string}")
   private String someSrting; //will get value from the yml file.

}
6
Yarix

nit Test mit Spring Boot 2

spring Boot 2 unterstützt standardmäßig 'application.properties', für 'application.yml' fügen Sie einfach Folgendes hinzu:

@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })

z.B.

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
public class ServiceTest {...}
3
Liam

Spring Boot 2 Beispiel:

private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
        .withInitializer(new ConfigFileApplicationContextInitializer());

@Test public void test() throws Exception {

    this.contextRunner
    .withUserConfiguration(TestApplication.class)
    .run((context) -> {

        .....

    });
}
0
Ritesh

In meinem Fall habe ich versucht, eine Bibliothek ohne @SpringBootApp zu testen, die im regulären Klassenpfad der App deklariert ist, aber ich habe eine in meinem Testkontext. Nach dem Debugging durch den Spring Boot-Initialisierungsprozess entdeckte ich, dass Spring Boot YamlPropertySourceLoader (ab 1.5.2.RELEASE) keine YAML-Eigenschaften lädt, sofern sich org.yaml.snakeyaml.Yaml nicht im Klassenpfad befindet. Die Lösung für mich bestand darin, snakeyaml als Testabhängigkeit in meinem POM hinzuzufügen:

    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.19</version>
        <scope>test</scope>
    </dependency>
0
Lyle