嗨我正在使用Spring Boot,我想在Bean中注入.yml文件的值.我已经编写了集成测试用例,但看起来像通过Integration测试用例它没有注入值.
问题是url的值,keyspaceApp为null
豆
@ConfigurationProperties(prefix="cassandra")
public class TestBean {
@Value("${urls}")
private String urls;
@Value("${keyspaceApp}")
private String app;
public void print() {
System.out.println(urls);
System.out.println(app);
}
public String getUrls() {
return urls;
}
public void setUrls(String urls) {
this.urls = urls;
}
}
Run Code Online (Sandbox Code Playgroud)
集成测试用例
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestBean.class)
@IntegrationTest
public class CassandraClientTest {
@Autowired
private TestBean bean;
@Test
public void test() {
bean.print();
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序yml文件
cassandra:
urls: lllaaa.com
keyspaceApp: customer
createDevKeyspace: true
Run Code Online (Sandbox Code Playgroud) 我有一个SpringBootTest测试应该依赖一个单独的类来设置嵌入式 Postgres 和数据源。
因此 Repository 配置如下所示:
package com.stream.repository.configuration
@Configuration
@ComponentScan(basePackages = arrayOf("com.stream.repository"))
@EntityScan(basePackages = arrayOf("com.stream.repository"))
@EnableJpaRepositories(basePackages = arrayOf("com.stream.repository"))
@EnableAutoConfiguration
class RepositoryConfiguration {
Run Code Online (Sandbox Code Playgroud)
测试类如下所示:
package com.stream.webapp.rest
@AutoConfigureMockMvc(addFilters = false)
@SpringBootTest(properties =
[
"spring.jpa.hibernate.ddl-auto=validate",
"spring.jpa.show-sql=true",
"spring.liquibase.enabled=true",
"spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yml",
"spring.jpa.properties.hibernate.jdbc.time_zone=UTC"
],
classes = [RepositoryConfiguration::class, AuditController::class],
webEnvironment = SpringBootTest.WebEnvironment.MOCK)
class AuditControllerTest {
Run Code Online (Sandbox Code Playgroud)
这就是它变得奇怪的地方。如果我使用该配置运行,它会抱怨找不到EntityManagerFactory
AuditService 需要一个无法找到的类型为“javax.persistence.EntityManagerFactory”的 bean。
经过一番折腾,我找到了解决这个问题的办法。如果我移动它RepositoryConfiguration以便它在包中com.stream.webapp.rest,即与AuditControllerTest它一样神奇地工作。
我似乎找不到任何理由说明为什么会这样。那么任何人都可以解释它并且有办法解决它吗?因为我不想动它。把它放在哪里很有意义。
作为旁注,它是用 Kotlin 编写的,但我不明白为什么在这种情况下它很重要。而这仅用于测试。在测试范围之外运行应用程序时,它可以工作
我还可以补充一点,AuditControllerTest它在一个模块中,RepositoryConfiguration在另一个模块中。如果将其放置在“正确”的包中(仍然是单独的模块),则不确定它是否相关,因为它可以工作
问题的 TL; DR:为什么 spring 关心 …