wake-up-neo.com

Überschreiben Sie bei jedem Spring-Boot-Test eine einzelne @Configuration-Klasse

In meiner Spring Boot-Anwendung möchte ich nur eine meiner @Configuration - Klassen mit einer Testkonfiguration (insbesondere meine @EnableAuthorizationServer - @Configuration - Klasse) für alle meine Tests überschreiben.

Bisher ist nach einem Überblick über Testfunktionen für Federbeine und Testfunktionen für Federbeine keine einfache Lösung aufgetaucht:

  • @TestConfiguration: Dient zum Erweitern, nicht zum Überschreiben.
  • Mit @ContextConfiguration(classes=…​) und @SpringApplicationConfiguration(classes =…​) kann ich die gesamte Konfiguration überschreiben, nicht nur die eine Klasse.
  • Eine innere Klasse @Configuration In einer Klasse @Test Wird vorgeschlagen, um die Standardkonfiguration zu überschreiben, es wird jedoch kein Beispiel angegeben.

Irgendwelche Vorschläge?

41
NotGaeL

Innere Testkonfiguration

Beispiel einer inneren @Konfiguration für Ihren Test:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {

    @Configuration
    static class ContextConfiguration {
        @Bean
        @Primary //may omit this if this is the only SomeBean defined/visible
        public SomeBean someBean () {
            return new SomeBean();
        }
    }

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

Wiederverwendbare Testkonfiguration

Wenn Sie die Testkonfiguration für mehrere Tests wiederverwenden möchten, können Sie eine eigenständige Konfigurationsklasse mit einem Federprofil @Profile("test") definieren. Lassen Sie dann Ihre Testklasse das Profil mit @ActiveProfiles("test") aktivieren. Siehe vollständigen Code:

@RunWith(SpringRunner.class)
@SpringBootTests
@ActiveProfiles("test")
public class SomeTest {

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

@Configuration
@Profile("test")
public class TestConfiguration {
    @Bean
    @Primary //may omit this if this is the only SomeBean defined/visible
    public SomeBean someBean() {
        return new SomeBean();
    }
}

@ Primary

Die Annotation @Primary In der Bean-Definition soll sicherstellen, dass diese Priorität hat, wenn mehr als eine gefunden wird.

54
alexbt

Sie sollten Spring Boot-Profile verwenden :

  1. Kommentieren Sie Ihre Testkonfiguration mit @Profile("test").
  2. Kommentieren Sie Ihre Produktionskonfiguration mit @Profile("production").
  3. Stellen Sie das Produktionsprofil in Ihrer Eigenschaftendatei ein: spring.profiles.active=production.
  4. Stellen Sie mit @Profile("test") das Testprofil in Ihrer Testklasse ein.

Wenn Ihre Anwendung gestartet wird, wird die "Produktions" -Klasse verwendet, und wenn Teststars verwendet werden, wird die "Test" -Klasse verwendet.

Wenn Sie die Klasse inner/nested @Configuration Verwenden, wird diese anstelle der primären Konfiguration Ihrer Anwendung verwendet.

11
Slava Babin

Ich musste kürzlich eine Dev-Version unserer Anwendung erstellen, die mit dev aktivem Profil ohne Befehlszeilenargumente sofort ausgeführt werden sollte. Ich habe es gelöst, indem ich diese eine Klasse als neuen Eintrag hinzugefügt habe, wodurch das aktive Profil programmgesteuert festgelegt wird:

package ...;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;

@Import(OriginalApplication.class)
public class DevelopmentApplication {
    public static void main(String[] args) {
        SpringApplication application =
            new SpringApplication(DevelopmentApplication.class);
        ConfigurableEnvironment environment = new StandardEnvironment();
        environment.setActiveProfiles("dev");
        application.setEnvironment(environment);
        application.run(args);
    }
}

Siehe Spring Boot Profiles Example von Arvind Rai für weitere Details.

1
Tamas Hegedus