在测试中阅读 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.
在 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.