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 集成测试。拒绝连接

@WithMockUser 在集成测试中不起作用 - Spring boot

Spring Boot集成测试无法在命令行未指定配置文件时获取默认配置文件并抛出错误