Spring Boot集成测试无法访问application.properties文件

时间:2016-11-16 14:00:11

标签: java spring junit spring-boot integration-testing

我有一些用params[:project_id].to_i注释的类,我正在尝试使用@RestController类进行测试。端点从Web应用程序正确响应,但运行测试时出现以下错误(来自IntelliJ IDEA):

MockMvc

这就是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

另一方面,这就是REST控制器的实现方式(使用有问题的属性的地方):

@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 {
    ...
}

这就是应用程序主类的样子:

@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);
    }
}

我在整个网络上找到了几个问题的解决方案,但它们似乎都不适合我。

2 个答案:

答案 0 :(得分:2)

答案最终与Spring注释和IntelliJ配置无关,而是与MockMvc相关,特别是与在测试'{{{{1}上使用的类和方法MockMvcBuilders.standaloneSetup无关。 1}}。这不会使用应用程序的上下文,因此无法正确读取依赖于它的属性。

将其更改为setUp后(来自文档)

  

使用给定的完全初始化的构建[s] MockMvc实例(即,   刷新)WebApplicationContext。

一切顺利。对于集成测试,使用它更有意义,不是吗?

感谢您的所有时间和精力。很抱歉没有显示提到的MockMvcBuilders.webAppContextSetup方法,但我没想到问题可能是由那里造成的。

答案 1 :(得分:0)

您的application.properties不得在测试类路径上。您应该定义一个"测试资源"您在IntelliJ中的项目位置,并在那里创建一个application.properties文件。

BTW,我发现拥有一个单独的测试属性文件很有用,因为测试属性通常与正常的运行时环境不同。