在测试中阅读 spring 属性 资源之前的 xml 资源

Read spring property source before xml resource in test

在 spring 引导 1.4 中,在主要 class 我有一个配置 class 导入 xml 资源。

@ImportResource("classpath:app-config-c3p0.xml")

src/test/resources/application.properties 中,我为

提供了 属性
datasource.database.master.pool-size=1

但我仍然面临问题,我尝试添加订单,@PropertySource@TestPropertySource 但其中 none 有效。

以下是例外情况

Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [int] for property 'maxPoolSize'; nested exception is java.lang.NumberFormatException: For input string: "${datasource.database.master.pool-size}"
    at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:596)
    at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:603)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:216)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1532)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1491)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1231)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    ... 54 common frames omitted
Caused by: java.lang.NumberFormatException: For input string: "${datasource.database.master.pool-size}"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:569)
    at java.lang.Integer.valueOf(Integer.java:766)
    at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:208)
    at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:113)
    at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:468)
    at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:441)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:199)
    at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:576)
    ... 60 common frames omitted

当没有 运行 测试时它工作正常,因为属性是从 spring 云配置服务器读取的。

以下为测试用例

@WebMvcTest(VCController.class)
@RunWith(SpringRunner.class)
@TestPropertySource("classpath:test.properties")
public class VCControllerTest {

    @MockBean
    private VCGateway vCGateway;

    @Autowired
    private MockMvc mvc;

    @Test
    public void testCreateVoucher() throws Exception {
        int timeout = 10;
        CreateVC createVC = new CreateVC(timeout);
        CreatedVCModel createdVCModel = new CreatedVCModel();

        given(vCGateway.create(createVC)).willReturn(createdVCModel);


        mvc.perform(post("/v1/vc")
                .content(json(createVC))
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isCreated());
    }



}

此错误通常在 属性 未解决时发生。

src/test/resources 下为您的测试属性添加一个 resources 目录,这应该有效。

您是否尝试将 PropertySourcesPlaceholderConfigurer bean 添加到您的 java 配置中以解析 @Value 注释中的 ${...} 表达式。

通过添加这个内部 class:

@Configuration
public static class TestContext{
        @Bean
        public static PropertySourcesPlaceholderConfigurer properties(){
          return new PropertySourcesPlaceholderConfigurer();
        }
}

如果需要 将 @ContextConfiguration(loader=AnnotationConfigContextLoader.class) 添加到您的 VCControllerTest 测试 class 以加载 @Configuration class.