【问题标题】:Change @PropertySource value in run time在运行时更改 @PropertySource 值
【发布时间】:2016-10-30 08:59:38
【问题描述】:

当 junit 测试用例运行时,如何在运行时更改 @PropertySource 的值。例如,

我想替换下面的值,

@PropertySource(value = "file:${app.deploy.env}/sample/mine.properties", ignoreResourceNotFound = true)

value = "classpath:sample/mine.properties"

junit 测试运行时。

【问题讨论】:

  • 你为什么要这样做?你能提供代码并解释你想要实现的目标吗?
  • 嗯...为什么不按预期的方式使用呢?为所有动态部分添加表达式,例如:value = "${protocol}:${app.deploy.env}/sample/mine.properties" 并根据环境在 fileclasspath 之间切换 ${protocol} 的值。

标签: java spring reflection junit spring-boot


【解决方案1】:

如果你真的想这样做,你可以这样做,但我不建议你这样做。您首先需要确定哪个 PropertySource 包含该值。由于您的示例中有该注释,因此 PropertySource 将添加到常规注释中,可能作为第一个实例。

您可以将Environment 注入到托管bean 中,您希望在其中将更改作为ConfigurableEnvironment 进行,并通过取消调用环境中的getMutablePropertySources() 来检索PropertySource

话虽如此。为什么?如何改变你的应用程序的这些基本属性代表了你的应用程序将发生什么。看起来您正在使用 Spring 运行器,并且您希望在不同的测试方法中使用不同的设置来启动您的应用程序。如果这就是你想做的,不要使用跑步者而是自己管理上下文,这真的没那么难。

例如,这里有 JMS-related tests 更改 Environment 以测试各种场景。您可以easily load the context with a specific set of keys@After method makes sure to shutdown the context for each test

我们在 Spring Boot 中经常使用这种模式。事实上,我有一个 JUnit 规则,可以帮助我几个月来完成我的待办事项列表中的所有内容。

【讨论】:

  • 谢谢。实际上,我在资源目录下有属性文件,然后在 config 目录下有不同环境的属性文件,例如 dev、qa。我的应用程序是作为一个 debian 包构建的,当它安装在不同的环境中时,它会使用启动脚本启动 spring boot jar 并传递 java 参数,例如 app.deploy.env。所以当 junit 在 jenkins 中运行时,我想说的是加载资源下的属性文件并运行单元测试。
  • 我还发现我可以通过 maven build 命令知道我可以传递 java 参数。所以我想用 app.deploy.env 指向资源文件夹下的属性文件来构建我的应用程序,这样单元测试也可以成功运行。它很简单,我也不必在运行时更改 @PropertySource 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2021-07-27
  • 2013-08-17
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多