30 votes

Printemps De Démarrage: @TestConfiguration Ne Prévalent Pas Du Haricot Au Cours Du Test D'Intégration

J'ai un Bean définie dans une classe décorée avec @Configuration:

@Configuration
public class MyBeanConfig {

    @Bean
    public String configPath() {
        return "../production/environment/path";
    }
}

J'ai une classe décorée avec @TestConfiguration qui devrait remplacer cette Bean:

@TestConfiguration
public class MyTestConfiguration {

    @Bean
    @Primary
    public String configPath() {
        return "/test/environment/path";
    }
}

L' configPath bean est utilisé pour définir le chemin d'accès à un fichier externe contenant un code d'enregistrement qui doit être lu lors du démarrage. Il est utilisé dans un @classe de Composant:

@Component
public class MyParsingComponent {

    private String CONFIG_PATH;

    @Autowired
    public void setCONFIG_PATH(String configPath) {
        this.CONFIG_PATH = configPath;
    }
}

Tout en essayant de débogage, j'ai mis un point d'arrêt à l'intérieur de chaque méthode ainsi que le constructeur de la config de test de la classe. L' @TestConfigurations'constructeur de point d'arrêt est atteint, donc je sais que mon test de la configuration de la classe instancie, cependant l' configPath() méthode de cette classe n'est jamais atteint. Au lieu de cela, l' configPath() méthode de la normale @classe de Configuration est frappé et l' @Autowired String en MyParsingComponent toujours ../production/environment/path plutôt que de l'attendre /test/environment/path.

Pas sûr de savoir pourquoi cela se passe. Toutes les pensées seraient grandement appréciés.

52voto

Sam Brannen Points 1763

Comme indiqué dans le Test de Détection de la Configuration de la section du Printemps de Démarrage manuel de référence, tous les haricots configuré dans un haut-niveau de la classe annotée avec l' @TestConfiguration va pas être ramassés par l'intermédiaire de la composante de la numérisation. Donc, vous devez vous inscrire explicitement votre @TestConfiguration classe.

Vous pouvez le faire soit via @Import(MyTestConfiguration.class) ou @ContextConfiguration(classes = MyTestConfiguration.class) sur votre classe de test.

D'autre part, si votre classe annotée avec l' @TestConfiguration ont un static classe imbriquée à l'intérieur de votre classe de test, il serait automatiquement enregistré.

8voto

Marcel Thimm Points 71

Assurez-vous que le nom de la méthode de votre @Bean factory méthode ne correspond pas à l'existant bean nom. J'ai eu des problèmes avec la méthode des noms comme config() ou (dans mon cas) prometheusConfig() est entré en collision avec l'existant bean noms. Printemps ignore ces méthodes de fabrique en silence et tout simplement ne pas les appeler et ne permet pas d'instancier les haricots.

Si vous souhaitez remplacer un haricot définition dans votre test, utilisez le haricot nom, explicitement, comme une chaîne de caractère en paramètre dans votre @Bean("beanName") annotation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X