使用属性值

时间:2015-10-29 09:55:03

标签: java spring rest unit-testing spring-boot

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

@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 Context配置用于测试,只有一个Bean与生产版本不同。

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

@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控制器在生产模式下启动时正在运行。在单元测试模式下,在构建mockMvc对象时,未设置${base.url}值并抛出异常:

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

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

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

以及其他各种组合,但似乎没有任何效果。 那么我该如何继续,以使其工作? 我认为这是两个不同的配置类的Context配置问题,但我不知道如何解决它或如何“正确”。

3 个答案:

答案 0 :(得分:1)

您需要将占位符值添加到独立设置 -

mockMvc=MockMvcBuilders.standaloneSetup(youController).addPlaceholderValue(name, value);

答案 1 :(得分:0)

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

answer也可以为实施提供一些帮助。

答案 2 :(得分:0)

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

#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