Gradle 7.6“test”目标在Sping Boot 应用程序的类路径中不包含“src/test/resources”

k10s72fa  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

我正在开发Sping Boot 3.0.3应用程序,并像这样使用@PropertySource

@SpringBootApplication
@PropertySource(value = "application-${ENV:LOCAL}.properties", ignoreResourceNotFound = false)
public class SampleApp {
  // ...code
}

字符串
加载另一个ENV特定的.properties文件。当应用程序运行时,这工作得很好,但是在单元测试中,我似乎无法让它在src/test/resourcessrc/main/resources中找到application-UNIT.properties文件。
例如,我有一个测试:

@SpringBootTest
@TestPropertySource(properties = {"ENV=UNIT"})
class SampleAppTest {
  // ...code
}


当我在start.spring.io上使用Sping Boot Initializer附带的主要股票Gradle build.gradle运行此操作时,我得到一个错误,如:

...
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/application-UNIT.properties]
...


我已经尝试了各种方式添加路径,比如通过sourceSets添加路径,比如:

sourceSets {
  test {
    resources.srcDir(file('src/test/resources'))
  }


或者通过添加一个类似于以下的块:

test {
  classpath = sourceSets.test.runtimeClasspath + files("src/test/resources")
}


每个组合使用${projectDir}作为前缀,带完整路径,带尾随/,带尾随/*,但似乎没有什么允许单元测试运行。我甚至在build.gradle文件中放置了断点,并验证了我在Intelli中看到了相应Gradle对象中的值-J的调试器。希望有人能指出我在这里的正确方向,因为我已经用尽了我的谷歌'ing能力。

oewdyzsn

oewdyzsn1#

好吧,我觉得自己很笨,但我最终通过跟踪Sping Boot 中的Property加载代码找到了答案。
本质上,在主app类的@PropertySource注解中,你必须以classpath:开始文件名,如下所示:

@PropertySource(value = "classpath:application-${ENV:LOCAL}.properties", ignoreResourceNotFound = false)

字符串
如果你不这样做,它会通过使用Classpath资源加载器加载属性文件的if块。我仍然不知道为什么当我在IDE中运行应用程序或将其打包在Docker容器中并在Kubernetes中运行时它会正常工作,但任何遇到这个问题并偶然发现这篇文章的人至少有一些容易尝试的东西。

相关问题