如何使用@TestPropertySource覆盖单元测试中@ConfigurationProperties配置类中使用的@PropertySource的配置值

pas*_*kos 5 unit-testing spring-boot

我有一个配置属性实例,前缀为"assets".

@Configuration
@ConfigurationProperties( prefix = "assets", ignoreUnknownFields = true )
public class AssetsProperties
{
   @NotNull
   private Resource     file;

   public Resource getFile()
   {
     return file;
   }

   public void setFile( Resource file )
   {
     this.file = file;
   }
}
Run Code Online (Sandbox Code Playgroud)

其默认配置定义如下:

@Configuration
@PropertySource( name = "assetsConfig", value = "classpath:com/package/boot/web/ui/assets/config/default-assets-config.properties" )
@Order( LOW_ORDER )
public class AssetsConfig
{
}
Run Code Online (Sandbox Code Playgroud)

default-assets-config.properties包含:

assets.file=classpath:assets.json
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我想使用以下方法覆盖默认值:

@TestPropertySource( locations = "classpath:com/package/boot/web/ui/assets/tests/assets-config.properties" )
Run Code Online (Sandbox Code Playgroud)

assets-config.properties包含

assets.file=classpath:com/package/boot/web/ui/assets/tests/assets.json
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个值永远不会注入AssetsProperties.我做错了什么,我不明白,因为Spring fmk ref doc说

测试属性源的优先级高于从操作系统环境或Java系统属性加载的属性源,以及应用程序通过@PropertySource或以编程方式声明性地添加的属性源.

提前致谢,

Paskos

And*_*son 7

在Spring Boot中遇到了限制,这意味着它忽略了使用配置的属性文件@TestPropertySource.或者,您可以配置一个或多个内联属性:

@TestPropertySource(properties = "assets.file=classpath:com/package/boot/web/ui/assets/tests/assets.json")
Run Code Online (Sandbox Code Playgroud)