問題描述
application.yml部分配置配置項如下:
server:
port: 8080
domain: localhost
配置項對應的類代碼如下:
@Component
@Data
public class SiteConfig {
//域名
@Value("${domain:#{null}}")
private String domain;
//端口號
@Value("${server.port:#{8081}}")
private Integer port;
}
測試類代碼如下:
@Slf4j
@SpringBootTest
class SiteConfigTest {
@Resource
private SiteConfig siteConfig;
@Test
void getDomain() {
log.info("siteConfig: {}", siteConfig.getDomain());
assertEquals("localhost", siteConfig.getDomain());
}
@Test
void getPort() {
log.info("Port: {}", siteConfig.getPort());
assertEquals(8080, siteConfig.getPort());
}
}
在測試方法getPort()
中,端口號port獲取的值爲-1。
原因
測試類啓動springboot程序時並沒有以配置端口啓動服務,所以我們要以配置端口的方式啓動服務。
org.springframework.boot.test.context.SpringBootContextLoader#getInlinedProperties
protected String[] getInlinedProperties(MergedContextConfiguration config) {
ArrayList<String> properties = new ArrayList<String>();
// JMX bean names will clash if the same bean is used in multiple contexts
disableJmx(properties);
properties.addAll(Arrays.asList(config.getPropertySourceProperties()));
if (!isEmbeddedWebEnvironment(config) && !hasCustomServerPort(properties)) {
properties.add("server.port=-1");
}
return properties.toArray(new String[properties.size()]);
}
解決
在@SpringBootTest
中添加屬性值@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@Slf4j
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class SiteConfigTest {
@Resource
private SiteConfig siteConfig;
@Test
void getDomain() {
log.info("siteConfig: {}", siteConfig.getDomain());
assertEquals("localhost", siteConfig.getDomain());
}
@Test
void getPort() {
log.info("Port: {}", siteConfig.getPort());
assertEquals(8080, siteConfig.getPort());
}
}
參考
https://stackoverflow.com/questions/46684818/springboot-test-valueserver-port