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

时间:2017-08-03 10:10:34

标签: 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")
  }

}

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

另外,testBaseConfiguration确实有效,并断言为true。 虽然,testOverrideConfiguration不会,并且断言为false。

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

知道我做错了什么?

编辑1:这是DataBaseComponent:

@Configuration
@EnableAutoConfiguration
@ComponentScan
open class DatabaseComponent

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

2 个答案:

答案 0 :(得分:2)

尝试

  

@Test     有趣的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中替换为[0]

答案 1 :(得分:1)

是不是因为您的属性在测试中被称为groups.base.override而不是groups.datasource.override?