TL;DR:
它正在发生,因为@ConfigurationProperties
不受应用程序上下文管理你构建测试,尽管它们会在应用程序启动时加载,因为您有@EnableConfigurationProperties
在您的应用程序主类上。
@EnableConfigurationProperties
在主类上仅影响您所拥有的应用程序上下文bootRun
, 但不是在@SpringBootTest
。在许多情况下,您在测试中构建的应用程序上下文可能与bootRun
,就像你的情况一样。
你可以加@Component
让上下文意识到它,无论是在gradle bootRun
and in gradle test
。这是最简单的方法,但不是 100% 建议的方法。
如果你有时间的话,更合适的方法是详细说明
相反,您可以添加@EnableConfigurationProperties({Config1.class, Config2.class})
in a @SpringBootTest
,仅将一些配置属性类注入到上下文中,以避免注入开销。
它会像:
//@RunWith(SpringRunner.class) // for JUnit4 in Spring
@ExtendWith(SpringExtension.class) // for JUnit5 in Spring.
@SpringBootTest
@EnableConfigurationProperties({
ResourcesConfigProperties.class,
})
@Data
public class ConfigsTest {
@Autowired
private ResourcesConfigProperties resourceConfigProperties;
...
}
更好的是,您可以使用@SpringBootTest(classes={})
: 内的课程{}
是那些你想要的应用程序上下文@SpringBootTest
管理(创建、初始化、从 yaml 文件加载属性等)。然后您不必加载所有上下文,而只需加载其中的一部分。
您可以将所有类别分组@ConfigurationProperties
在一类中@Configuration
,并将其放入classes={}
of @SpringBootTest
,而不是重复这个列表@ConfigurationProperties
到处。就像是:
//@RunWith(SpringRunner.class) // for JUnit4 in Spring
@ExtendWith(SpringExtension.class) // for JUnit5 in Spring.
@SpringBootTest(classes = {
TestConfiguration.class
})
@Data
public class ConfigsTest {
@Autowired
private ResourcesConfigProperties resourceConfigProperties;
...
}
TestConfiguration.java
:
@EnableConfigurationProperties({
ResourcesConfigProperties.class,
})
@Configuration
public class TestConfiguration {
}