Remplacez @Valeur de la propriété au sein de @Configuration au cours du Printemps de test au Démarrage

Scénario

J'ai un Ressort de Démarrage de l'application avec un @Configuration annoté Printemps de configuration de la classe qui contient quelques @Value annoté champs. Pour les tests je veux remplacer ces valeurs de champ personnalisé avec des valeurs de test.

Malheureusement, ces valeurs de test ne peut pas être substituée à l'aide d'un simple fichier de propriétés (String) constantes ou similaire, mais je doit utiliser certains personnalisée écrite de la propriété résoudre classe Java (par exemple TargetProperties.getProperty("some.username")).

Le problème que j'ai c'est que quand j'ajoute une coutume PropertySource à la ConfigurableEnvironment dans ma configuration de test, il est déjà trop tard, car ce PropertySource sera ajouté après la par exemple RestTemplate a été créé.

Question

Comment puis-je remplacer @Value annoté champs dans un @Configuration classe avec des propriétés obtenues par programme via code Java personnalisé avant autre chose est initialisé?

Code

Configuration De La Production De La Classe

@Configuration
public class SomeConfiguration {

    @Value("${some.username}")
    private String someUsername;

    @Value("${some.password}")
    private String somePassword;

    @Bean
    public RestTemplate someRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        restTemplate.getInterceptors().add(
            new BasicAuthorizationInterceptor(someUsername, somePassword));

        return restTemplate;
    }

}

Configuration De Test De La Classe

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class SomeTest {

    @SpringBootConfiguration
    @Import({MySpringBootApp.class, SomeConfiguration.class})
    static class TestConfiguration {

        @Autowired
        private ConfigurableEnvironment configurableEnvironment;

        //This doesn't work:

        @Bean
        @Lazy(false)
        //I also tried a @PostConstruct method
        public TargetPropertiesPropertySource targetPropertiesPropertySource() {
            TargetPropertiesPropertySource customPropertySource =
                new TargetPropertiesPropertySource();
            configurableEnvironment.getPropertySources().addFirst(customPropertySource);
            return customPropertySource;
        }
    }
}

OriginalL'auteur Markus Ratzer | 2016-09-08