我有一些用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);
}
}
我在整个网络上找到了几个问题的解决方案,但它们似乎都不适合我。
答案 0 :(得分:2)
答案最终与Spring注释和IntelliJ配置无关,而是与MockMvc
相关,特别是与在测试'{{{{1}上使用的类和方法MockMvcBuilders.standaloneSetup
无关。 1}}。这不会使用应用程序的上下文,因此无法正确读取依赖于它的属性。
将其更改为setUp
后(来自文档)
一切顺利。对于集成测试,使用它更有意义,不是吗?使用给定的完全初始化的构建[s] MockMvc实例(即, 刷新)WebApplicationContext。
感谢您的所有时间和精力。很抱歉没有显示提到的MockMvcBuilders.webAppContextSetup
方法,但我没想到问题可能是由那里造成的。
答案 1 :(得分:0)
您的application.properties
不得在测试类路径上。您应该定义一个"测试资源"您在IntelliJ中的项目位置,并在那里创建一个application.properties
文件。
BTW,我发现拥有一个单独的测试属性文件很有用,因为测试属性通常与正常的运行时环境不同。