首页 > 解决方案 > 未从 application-dev.properties 传递到组件的值

问题描述

我在 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/弹簧型材

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

    一个。环境变量 b. 使用@ActiveProfiles注释

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

应用程序属性

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

应用程序-dev.properties

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

应用程序-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创建成功

标签: springspring-bootjunitprofile

解决方案


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

@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


推荐阅读