How can I override Spring Boot application.properties programmatically?

后端 未结 10 1720
失恋的感觉
失恋的感觉 2020-11-29 18:33

I have jdbc property files which I take from external configuration web-service In spring boot in order to set mysql props it\'s easy as adding those to application.properti

10条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-29 19:07

    As of Spring Boot 2.0.X, you can dynamically override individual properties (for example, in a unit test) using a combination of a custom ApplicationContextInitializer and the ContextConfiguration annotation.

    import org.junit.Test;
    import org.junit.runner.RunWith;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.test.context.PortTest.RandomPortInitailizer;
    import org.springframework.context.ApplicationContextInitializer;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.context.support.TestPropertySourceUtils;
    import org.springframework.util.SocketUtils;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @ContextConfiguration(initializers = RandomPortInitializer.class)
    public class PortTest {
        @Autowired
        private SomeService service;
    
        @Test
        public void testName() throws Exception {
            System.out.println(this.service);
            assertThat(this.service.toString()).containsOnlyDigits();
        }
    
        @Configuration
        static class MyConfig {
    
            @Bean
            public SomeService someService(@Value("${my.random.port}") int port) {
                return new SomeService(port);
            }
        }
    
        static class SomeService {
            private final int port;
    
            public SomeService(int port) {
                this.port = port;
            }
    
            @Override
            public String toString() {
                return String.valueOf(this.port);
            }
        }
    
        public static class RandomPortInitializer
                implements ApplicationContextInitializer {
    
            @Override
            public void initialize(ConfigurableApplicationContext applicationContext) {
                int randomPort = SocketUtils.findAvailableTcpPort();
                TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
                        "my.random.port=" + randomPort);
            }
        }
    }
    

提交回复
热议问题