java - Spring PropertySources 已加载但未在测试中应用

标签 java spring kotlin

我遇到了连线问题,但没有找到任何提示。

我正在使用属性文件处理数据库分片配置。 我得到了一个负责加载这些属性的类:

@Component
@PropertySources(value = *arrayOf(
    PropertySource("classpath:/dbconfig/base.properties"),
    PropertySource("classpath:/dbconfig/override.properties", ignoreResourceNotFound = true)
))
@ConfigurationProperties("groups.datasource")
class DbConfig {
  val base: List<DataSourceProperties> = ArrayList()
  val override: List<DataSourceProperties> = ArrayList()
}

然后,我在配置类中使用这个组件来设置我的数据源。

这是我的 src/main/resources/dbconfig/base.properties 文件:

#Spring Boot Config for Oracle
# CENTRAL
groups.datasource.base[0].name=central
groups.datasource.base[0].url=jdbc:oracle:thin:@url:1530:sid
groups.datasource.base[0].username=user
groups.datasource.base[0].password=passwd
groups.datasource.base[0].driver=class name=oracle.jdbc.driver.OracleDriver

还有我的 src/test/resources/dbconfig/override.properties 文件:

#Spring Boot Config for Oracle
# PREPROD
groups.base.override[1].name=preprod
groups.base.override[1].url=jdbc:oracle:thin:@user:1542:sid
groups.base.override[1].username=user
groups.base.override[1].password=passwd
groups.base.override[1].driver=class name=oracle.jdbc.driver.OracleDriver

这是我的测试类:

@RunWith(SpringJUnit4ClassRunner::class)
@SpringBootTest(classes = arrayOf(DatabaseComponent::class))
open class DatabaseComponentTest {

  @Autowired
  lateinit var env: Environment

  @Test
  fun testBaseConfiguration() {
    assert(env.getProperty("groups.datasource.base[0].name") == "central")
    assert(env.getProperty("groups.datasource.base[0].url") == "jdbc:oracle:thin:@url:1530:sid")
    assert(env.getProperty("groups.datasource.base[0].username") == "user")
    assert(env.getProperty("groups.datasource.base[0].password") == "passwd")
    assert(env.getProperty("groups.datasource.base[0].driver") == "class name=oracle.jdbc.driver.OracleDriver")
  }

  @Test
  fun testOverrideConfiguration() {
    assert(env.getProperty("groups.datasource.override[0].name") == "preprod")
    assert(env.getProperty("groups.datasource.override[0].url") == "jdbc:oracle:thin:@url:1542:sid")
    assert(env.getProperty("groups.datasource.override[0].username") == "user")
    assert(env.getProperty("groups.datasource.override[0].password") == "passwd")
    assert(env.getProperty("groups.datasource.override[0].driver") == "class name=oracle.jdbc.driver.OracleDriver")
  }

}

在 Debug模式下,当我查看 classLoader 时,文件 override.properties 似乎加载了他的所有值。

另外,testBaseConfiguration 确实有效,并且断言为真。 而 testOverrideConfiguration 则不会,并断言为 false。

另一件事,所有这些行为在 Spring 模块中运行良好,覆盖在这里并加载。我的问题仅针对我的测试用例。

知道我做错了什么吗?

编辑 1:这是 DataBaseComponent:

@Configuration
@EnableAutoConfiguration
@ComponentScan
open class DatabaseComponent

我还将我的代码放在 GitHub 上:https://github.com/romainbsl/spring-database-sharding

最佳答案

尝试

@Test fun testOverrideConfiguration() { assert(env.getProperty("groups.datasource.override[1].name") == "preprod") assert(env.getProperty("groups.datasource.override[1].url") == "jdbc:oracle:thin:@url:1542:sid") assert(env.getProperty("groups.datasource.override[1].username") == "user") assert(env.getProperty("groups.datasource.override[1].password") == "passwd") assert(env.getProperty("groups.datasource.override[1].driver") == "class name=oracle.jdbc.driver.OracleDriver") }

换句话说,将testOverrideConfiguration()中的[0]替换为[1]或override.properties中的us[0]

关于java - Spring PropertySources 已加载但未在测试中应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45481173/

相关文章:

java - 使请求参数绑定(bind)不区分大小写

functional-programming - 在 Kotlin 中取最后 n 个元素

java - 工厂模式和依赖关系

java - 如何获取 Apache POI 中单元格数字的格式化值?

java - 如何模拟 Class.forName 和 class.Constructor.newInstance()

java - 标签库存储在哪里?

java - 数据库多重内连接

java - Post API 没有给出任何反应

适用于 Kotlin 的 Android Parcelable 无法正常工作

Kotlin/Native - 如何使用 C 库和 Klib 文件?