web-dev-qa-db-fra.com

Remplacez une seule classe @Configuration à chaque démarrage printanier @Test

Sur mon application de démarrage printanière, je souhaite remplacer une seule de mes classes @Configuration Par une configuration de test (en particulier ma classe @EnableAuthorizationServer@Configuration), Dans tous mes tests.

Jusqu'à présent, après un aperçu de fonctionnalités de test de démarrage du ressort et fonctionnalités de test d'intégration du ressort , aucune solution simple n'a fait surface:

  • @TestConfiguration: C'est pour étendre, pas écraser;
  • @ContextConfiguration(classes=…​) et @SpringApplicationConfiguration(classes =…​) me permettent de remplacer la configuration entière, pas seulement la classe;
  • Une classe interne @Configuration À l'intérieur d'un @Test Est suggérée pour remplacer la configuration par défaut, mais aucun exemple n'est fourni;

Aucune suggestion?

41
NotGaeL

configuration de test interne

Exemple de @Configuration interne pour votre 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
    }
}

configuration de test réutilisable

Si vous souhaitez réutiliser la configuration de test pour plusieurs tests, vous pouvez définir une classe de configuration autonome avec un profil de ressort @Profile("test"). Ensuite, demandez à votre classe de test d’activer le profil avec @ActiveProfiles("test"). Voir le code complet:

@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();
    }
}

@ Primaire

L'annotation @Primary Sur la définition du bean est destinée à garantir que celle-ci sera prioritaire si plusieurs sont trouvées.

54
alexbt

Vous devriez utiliser profils de démarrage à ressort :

  1. Annotez votre configuration de test avec @Profile("test").
  2. Annotez votre configuration de production avec @Profile("production").
  3. Définissez le profil de production dans votre fichier de propriétés: spring.profiles.active=production.
  4. Définissez le profil de test dans votre classe de test avec @Profile("test").

Ainsi, lorsque votre application démarrera, elle utilisera la classe "production" et, lorsque les étoiles de test, elle utilisera la classe "test".

Si vous utilisez la classe inner/nested @Configuration, Elle sera utilisée à la place de la configuration principale de votre application.

11
Slava Babin

J'ai récemment dû créer une version de développement de notre application, qui devrait fonctionner avec le profil actif dev prêt à l'emploi, sans aucun argument de ligne de commande. Je l'ai résolu en ajoutant cette classe en tant que nouvelle entrée, qui définit le profil actif par programme:

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

Voir Exemple de profils d'amorçage de printemps par Arvind Rai pour plus de détails.

1
Tamas Hegedus