首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于属性值RequestMapping的弹簧启动REST控制器测试

基于属性值RequestMapping的弹簧启动REST控制器测试
EN

Stack Overflow用户
提问于 2015-10-29 09:55:02
回答 3查看 4.1K关注 0票数 5

关于Spring控制器的单元测试,我遇到了@RequestMapping和应用程序属性的问题。

代码语言:javascript
复制
@RestController
@RequestMapping( "${base.url}" )
public class RESTController {
    @RequestMapping( value = "/path/to/{param}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE )
    public String getStuff( @PathVariable String param ) {
        // implementation of stuff
    }
}

我正在处理应用程序的几个概要文件,因此我有几个application-{profile}.properties文件。在每个文件中设置和显示base.url属性值。我还为测试提供了不同的Spring上下文配置,它只在一个Bean中与生产版本不同。

通过使用JUNit和Mockito /RestAssured,我的单元测试如下:

代码语言:javascript
复制
@ActiveProfiles( "dev" )
@RunWith( SpringJUnit4ClassRunner.class )
@SpringApplicationConfiguration( classes = SpringContextConfigTest.class )
public class RESTControllerTest {

private static final String SINGLE_INDIVIDUAL_URL = "/query/api/1/individuals/";

@InjectMocks
private RESTController restController;

@Mock  
private Server mockedServer; // needed for the REST Controller to forward

@Before
public void setup() {
  RestAssuredMockMvc.mockMvc( MockMvcBuilders.standaloneSetup(restController).build() );
 MockitoAnnotations.initMocks( this );
}

@Test
public void testGetStuff() throws Exception {
  // test the REST Method "getStuff()"
}

问题是,REST控制器在生产模式下启动时正在工作。在单元测试模式中,在构建${base.url}对象时,不设置mockMvc值并引发异常:

java.lang.IllegalArgumentException: Could not resolve placeholder 'base.url' in string value "${base.url}"

我也尝试了以下方法,但有不同的例外:

  • @IntegrationTest考试,
  • @WebAppConfiguration
  • 使用webApplicationContext构建MockMVC
  • 自动测试中的RESTController
  • 手动在SpringContextConfigTest类中定义REST控制器Bean

以及其他各种组合,但似乎什么都不起作用。那么,我要如何继续下去,才能让它发挥作用呢?我认为这是两个不同配置类的上下文配置问题,但我不知道如何解决这个问题,也不知道如何“正确”解决它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-06 14:21:48

我解决了使用一个application.yml文件而不是配置文件属性的问题。yml文件使用了default配置文件的标准定义,该定义位于文件的顶部。

代码语言:javascript
复制
#default settings. these can be overriden for each profile.
#all these settings are overriden by env vars by spring priority
rest:
  api:
    version: 1
base:
   url: /query/api/${rest.api.version}
---
spring:
   profiles: dev
---
spring:
   profiles: production
main:
  show_banner: true
---
spring:
   profiles: test
base:
   url: /query/override/default/value
票数 0
EN

Stack Overflow用户

发布于 2017-11-10 11:00:58

您将被要求添加占位符值,以便单独安装-

代码语言:javascript
复制
mockMvc=MockMvcBuilders.standaloneSetup(youController).addPlaceholderValue(name, value);
票数 4
EN

Stack Overflow用户

发布于 2015-10-29 13:52:08

似乎在非生产模式下,属性占位符无法被解析。您肯定希望查看PropertyPlaceholderConfigurer文档页面。

这个回答还可以为实现提供一些帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33410962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档