【问题标题】:Spring boot, read yml properties via integration test caseSpring boot,通过集成测试用例读取 yml 属性
【发布时间】:2014-12-09 22:27:40
【问题描述】:

您好,我正在使用 Spring Boot,我想在 Bean 中注入 .yml 文件的值。我已经编写了集成测试用例,但看起来通过集成测试用例它没有注入值。

问题是 url 的值和 keyspaceApp 为空

豆子

    @ConfigurationProperties(prefix="cassandra")
public class TestBean {

    @Value("${urls}")
    private String urls;

    @Value("${keyspaceApp}")
    private String app;

    public void print() {
        System.out.println(urls);
        System.out.println(app);
    }

    public String getUrls() {
        return urls;
    }

    public void setUrls(String urls) {
        this.urls = urls;
    }
}

集成测试用例

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestBean.class)
@IntegrationTest
public class CassandraClientTest {

    @Autowired
    private TestBean bean;

    @Test
    public void test() {
        bean.print();
    }
}

应用yml文件

cassandra:
  urls: lllaaa.com
  keyspaceApp: customer
  createDevKeyspace: true

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    这是我如何让它工作的:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(initializers=ConfigFileApplicationContextInitializer.class)
    public class MyTestClass {
    
      @Autowired
      private ConfigurableApplicationContext c;
    
      @Test
      public void myTestMethod() {            
         String value = c.getEnvironment().getProperty("myapp.property")
         ...
      }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      @SpringApplicationConfiguration(classes = TestBean.class, initializers = ConfigFileApplicationContextInitializer.class)
      

      来自其 JavaDocs:

      * {@link ApplicationContextInitializer} that can be used with the
      * {@link ContextConfiguration#initializers()} to trigger loading of
      * {@literal application.properties}.
      

      它说它适用于application.properties,但我想它也应该适用于application.yml

      【讨论】:

        【解决方案3】:

        如果资源文件夹中有“application-test.yml”。

        你可以试试这个:

        import org.springframework.test.context.ActiveProfiles;
        @ActiveProfiles("test")
        

        来自它的 Java 文档:

         * {@code ActiveProfiles} is a class-level annotation that is used to declare
         * which <em>active bean definition profiles</em> should be used when loading
         * an {@link org.springframework.context.ApplicationContext ApplicationContext}
         * for test classes.
         *
         * <p>As of Spring Framework 4.0, this annotation may be used as a
         * <em>meta-annotation</em> to create custom <em>composed annotations</em>.
        

        【讨论】:

        • 节省我一个小时,谢谢。
        【解决方案4】:

        SpringApplicationConfiguration 在 spring [Spring Boot v1.4.x] 中被弃用,并在 [Spring Boot v1.5.x] 中被删除。所以,这是一个更新的答案。

        MyTestClass 类是这样的:

        import org.junit.Test;
        import org.junit.runner.RunWith;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer;
        import org.springframework.test.context.ContextConfiguration;
        import org.springframework.test.context.junit4.SpringRunner;
        import static org.assertj.core.api.Assertions.assertThat;
        
        @RunWith(SpringRunner.class)
        @ContextConfiguration(classes = MyConfiguration.class, initializers = ConfigFileApplicationContextInitializer.class)
        public class MyTestClass {
            @Autowired
            private MyYmlProperties myYmlProperties;
        
            @Test
            public void testSpringYmlProperties() {
                assertThat(myYmlProperties.getProperty()).isNotEmpty();
            }
        }
        

        MyYmlProperties 类是这样的:

        import org.springframework.boot.context.properties.ConfigurationProperties;
        import org.springframework.context.annotation.Configuration;
        
        @Configuration
        @ConfigurationProperties(prefix = "my")
        public class MyYmlProperties {
            private String property;
            public String getProperty() { return property; }
            public void setProperty(String property) { this.property = property; }
        }
        

        我的application.yml 是这样的:

        my:
          property: Hello
        

        最后MyConfiguration 真的是空的:-) 你可以用你想要的来填充它:

        import org.springframework.boot.context.properties.EnableConfigurationProperties;
        import org.springframework.context.annotation.Configuration;
        
        @Configuration
        @EnableConfigurationProperties(value = MyYmlProperties.class)
        public class MyConfiguration {
        }
        

        【讨论】:

          【解决方案5】:

          这是另一种方式:[Spring Boot v1.4.x]

          import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
          import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
          
          @RunWith(SpringJUnit4ClassRunner.class)
          @BootstrapWith(SpringBootTestContextBootstrapper.class)
          public class CassandraClientTest {
          
            @Autowired
            private TestBean bean;
          
            @Test
            public void test() {
              bean.print();
            }
          }
          

          仅当“application.properties”文件也存在时才有效。

          例如maven 项目:

          src/main/resources/application.properties [ 文件可以为空,但必须填写! ]
          src/main/resources/application.yml [这是你真正的配置文件]

          【讨论】:

          • 第二个注解可以只是@SpringBootTest
          猜你喜欢
          • 2018-10-30
          • 2017-07-12
          • 2020-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-25
          • 1970-01-01
          相关资源
          最近更新 更多