相关疑难解决方法(0)

Spring启动,通过集成测试用例读取yml属性

嗨我正在使用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)

spring spring-boot

8
推荐指数
3
解决办法
2万
查看次数

春天奇怪地取决于班级位置

我有一个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 关心 …

java testing kotlin spring-boot spring-boot-test

6
推荐指数
1
解决办法
277
查看次数

标签 统计

spring-boot ×2

java ×1

kotlin ×1

spring ×1

spring-boot-test ×1

testing ×1