学习使用springboot过程中发现写在application.yml中的变量在测试类中读取的时候总是出现null,网上找了一堆解决方案都不能解决问题。
配置文件application-default.yml内容如下
http:
host: www.baidu.com
port: 8888
环境条件:idea社区版
springboot:2.6.7
maven:3.8.1
JDK:1.8
现记录解决方案如下:
1.pom.xml确保引入必要的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 自定义配置需要的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
2.config类确认加了必要的注解
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "http")
@Getter
@Setter
@ToString
public class HTTPConfig {
private String host;
private String port;
}
3.测试类加上必要的注解
// 根据自己的来
import com.xxx.datatest.config.HTTPConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes={DatatestApplication.class})
@ActiveProfiles("uat")
public class YmlTests {
@Autowired
private HTTPConfig httpConfig;
@Test
public void contextLoads() {
System.out.println(httpConfig);
}
}
然后尝试运行,完美解决问题
image.png
问题的关键是@ActiveProfiles这个注解,这个注解是在Spring单元测试加载ApplicationContext时指定profiles
@ActiveProfiles有以下参数:
profiles: 指定配置文件
resolver: 指定ActiveProfilesResolver,通过代码指定配置文件
value: profiles的别名
inheritProfiles: 配置文件是否继承父类,默认为true
网友评论