Spring Boot Test:未解析@Value的属性源

时间:2016-04-01 15:55:17

标签: spring-boot resourcebundle spring-test-mvc

我在使用Spring启动的JUNIT测试中遇到问题:@Value未解决。 代码如下:

Spring启动配置类:

@Configuration
@PropertySource(value="classpath:/config/parametrage-environnement.properties",name="env")
public class ExternalRessourceConfiguration {

    //To resolve ${} in @Value
        @Bean
        public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
            return new PropertySourcesPlaceholderConfigurer();
        }
}

课程测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class ConnexionEbicsResourceIntTest {

@Test
@Transactional
public void createConnexionEbics() throws Exception {

            restConnexionEbicsMockMvc.perform(post("/api/connexionEbicss")
            .contentType(TestUtil.APPLICATION_JSON_UTF8)
            .content(TestUtil.convertObjectToJsonBytes(connexionEbicsDTO)))
            .andExpect(status().isCreated());

Java资源:

@RestController
@RequestMapping("/api")
public class ConnexionEbicsResource {

    @Value("${env['connexion.proxy.host']}")
    //@Value("${connexion.proxy.host}") 
    public String protocol;

 @RequestMapping(value = "/connexionEbicss",
        method = RequestMethod.POST,
        produces = MediaType.APPLICATION_JSON_VALUE)
    @Timed
    public ResponseEntity<ConnexionEbicsDTO> createConnexionEbics( @RequestBody ConnexionEbicsDTO connexionEbicsDTO) throws URISyntaxException {
        log.debug("REST request to save ConnexionEbics : {}", connexionEbicsDTO);
        String a = protocol;

}

在java ressource中,当我运行测试时,“a”为null。 @Value没有解决,为什么?我的春季启动配置是全部启动。

parametrage-environnement.properties文件位于两个路径中:src / main / resources / config和src / test / resources / config(复制/粘贴)

1 个答案:

答案 0 :(得分:0)

1)由于我的控制器被嘲笑,我不能直接使用控制器中的弹簧注入(模拟湮灭Spring !)

2)语法

@Value("${env['connexion.proxy.host']}")

是错误的,因为env应该是一个spring bean(@Bean)。见here

所以,使用@PropertySource,我们必须使用@Value(&#34; $ {connexion.proxy.host}&#34;)语法,不要忘记解析器:

  //To resolve ${} in @Value
        @Bean
        public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
            return new PropertySourcesPlaceholderConfigurer();
        }

3)要在控制器类中设置协议,我需要从Test类中注入它:

 @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        ConnexionEbicsResource connexionEbicsResource = new ConnexionEbicsResource();
        ReflectionTestUtils.setField(connexionEbicsResource, "connexionEbicsService", connexionEbicsService);
        **ReflectionTestUtils.setField(connexionEbicsResource, "protocol", protocol);**
        ReflectionTestUtils.setField(connexionEbicsResource, "connexionEbicsMapper", connexionEbicsMapper);
        this.restConnexionEbicsMockMvc = MockMvcBuilders.standaloneSetup(connexionEbicsResource)
            .setCustomArgumentResolvers(pageableArgumentResolver)
            .setMessageConverters(jacksonMessageConverter).build();
    }

在测试类中加载资源包:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@PropertySource(value="classpath:/config/parametrage-environnement.properties",name="env")
//@PropertySource("classpath:/config/parametrage-environnement.properties")
public class ConnexionEbicsResourceIntTest {
....
  @Value("${connexion.proxy.host}")
    public String protocol;

非常感谢