Spring Boot 集成测试无法访问 application.properties 文件
Posted
技术标签:
【中文标题】Spring Boot 集成测试无法访问 application.properties 文件【英文标题】:Spring Boot integration tests cannot reach application.properties file 【发布时间】:2017-03-30 18:21:28 【问题描述】:我有一些用@RestController
注释的类,我正在尝试使用MockMvc
类进行测试。端点从 Web 应用程序正确响应,但在运行测试时出现以下错误(来自 IntelliJ IDEA):
java.lang.IllegalArgumentException: Could not resolve placeholder
'spring.data.rest.base-path' in string value "$spring.data.rest.base-path/whatever"
application.properties
文件如下所示:
spring.data.rest.base-path=/api
spring.profiles.active=dev
...
我还有一个名为 application-dev.properties
的文件,其中包含其他(不同的)属性。
这是测试类的注释方式:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebIntegrationTest // Also tried: @WebAppConfiguration
@ActiveProfiles("dev")
// Also tried: @PropertySource("classpath:application.properties")
// Also tried: @TestPropertySource("classpath:application.properties")
public class MyRestControllerTest
...
另一方面,这就是 REST 控制器的实现方式(使用有问题的属性):
@RestController
@RequestMapping("$spring.data.rest.base-path/whatever")
public class MyRestController
...
这是应用程序的主类的样子:
@SpringBootApplication(scanBasePackages = ...)
@EnableJpaRepositories(...)
@EntityScan(...)
public class Application
public static void main(String[] args)
SpringApplication.run(Application.class, args);
最后,这是项目结构的(一个子集):
my-project
|_ src
|_ java
| |_ com.example.x
| |_ controller
| |_ MyRestController.java
|
|_ test
| |_ com.example.x
| |_ controller
| |_ MyRestControllerTest.java
|
|_ resources
|_ application.properties
|_ application-dev.properties
我在整个网络上找到了几个解决该问题的方法,但似乎没有一个对我有用。
【问题讨论】:
我没有看到你在哪里使用了这个属性 对不起,你是对的,我没有澄清这一点。它在 REST 控制器中用于定义所有端点的基本路径。那里的财产做得很好——正如我所提到的,我可以按预期从浏览器访问它们。唯一无法读取的地方是测试。 Intellij 似乎没有将 /resources 识别为资源文件夹。试试@PropertySource('file:/path/to/application.properties') 【参考方案1】:您的application.properties
不得位于测试类路径中。您应该在 IntelliJ 中为您的项目定义一个“测试资源”位置,并在那里创建一个 application.properties
文件。
顺便说一句,我发现拥有一个单独的测试属性文件很有用,因为测试属性通常不同于正常的运行时环境。
【讨论】:
我尝试在 IntelliJ 上将资源文件夹标记为“测试资源根”,但这没有帮助。 当您查看测试类路径中的实际文件时,您看到了什么?不幸的是,我从未使用过 IntelliJ,所以我对那里的了解有限。也许***.com/questions/17039653/… 有帮助?【参考方案2】:答案最终与 Spring 注释或 IntelliJ 配置无关,而是与 MockMvc
相关,特别是与 MockMvcBuilders.standaloneSetup
类和方法相关,该类和方法用于测试的 setUp
。这不会使用应用程序的上下文,因此无法正确读取依赖于它的属性。
将其更改为MockMvcBuilders.webAppContextSetup
后,(来自文档)
使用给定的、完全初始化的(即, 刷新)WebApplicationContext。
一切正常。对于集成测试,使用它更有意义,不是吗?
感谢大家的时间和精力。很抱歉没有显示提到的setUp
方法,但我没想到问题可能是那里引起的。
【讨论】:
以上是关于Spring Boot 集成测试无法访问 application.properties 文件的主要内容,如果未能解决你的问题,请参考以下文章
无法理解 Spring Boot 如何使用 maven 管理集成测试。它是不是使用故障安全插件?
当在命令行中未指定配置文件时,Spring Boot 集成测试无法获取默认配置文件并引发错误
Spring Boot Test 无法使用 JUnit 5 为自定义集成测试源集加载应用程序上下文
Spring boot、ElasticSearch 和 TestContainers 集成测试。拒绝连接