值未从application-dev.properties传递到Component

时间:2019-04-25 23:45:06

标签: spring spring-boot junit profile

我正在Junit中编写测试,并且正在使用Spring Boot Framework(这是我的新手),并且需要使用不同的url来测试不同的环境 因此,除了application.properties之外,我还创建了2个资源文件

1> application-dev.properties
2> application-stage.properties

我创建了一个组件,该组件设置了要读取的属性值。

最后在我的测试文件中,我用以下注释了测试类: @ContextConfiguration(classes = {ComponentName.class})

在我的application.properties中,我也有这行: spring.profiles.active=dev

预期: 当我打印出Component类的属性值时,应从application-dev.properties中获取该值

实际:该值是null,尽管我的bean已成功创建

为什么该属性未注入application-dev.properties中的值?

  1. 我已经尝试了Baeldung的几篇文章(尽管有点令人困惑,这些文章展示了多种方法来完成同一件事,但没有展示一种完整的技术来端对端地完成所有事情 https://www.baeldung.com/spring-profiles

  2. 我还尝试了多种设置活动配置文件的方法:

    a。环境变量 b。使用@ActiveProfiles批注

注意:这是一个测试项目(我正在尝试对网站进行自动测试,因此我所有的资源文件都位于src.test.resources

application.properties

    #spring
    https://ops.dev.website.us
    spring.profiles.active=dev
    url.sms=https://ops.default.website.us

application-dev.properties

    url.sms=https://ops.dev.website.us

application-stage.properties

    url.sms=https://ops.stage.website.us

组件文件

    @Component
    @ConfigurationProperties(prefix = "url")
    public class DevEnvironment {

    private String sms;

    public String getSms() {
    return sms;
    }

    public void setSms(String sms) {
    this.sms = sms;
    }
    }

测试文件

@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {DevEnvironment.class})
public class MyTest implements ApplicationContextAware {
  @Autowired
  private ConfigurableEnvironment env;

  private DevEnvironment devEnvironment;
  String url;
  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    System.out.println("Active profiles:" + env.getActiveProfiles()[0]);
    devEnvironment = context.getBean(DevEnvironment.class);
    //System.out.println("from set app context:" + devEnvironment.getSms());
    url = devEnvironment.getSms();

  }

  @Test
  public void testSms(){
    System.out.println("inside test url:" +url);
  }
}

预期:当我打印出Component类的属性值时,应从application-dev.properties中获取该值

实际:该值是null,尽管我的bean已成功创建

1 个答案:

答案 0 :(得分:0)

您忘记了MyTest类的@SpringBootTest注释。

@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@RunWith(SpringRunner.class)
@SpringBootTest //add
@ContextConfiguration(classes = {DevEnvironment.class})
public class MyTest implements ApplicationContextAware {
 //
}

我做得很好。

参考:
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications