我正在使用Spring Boot 2.4.8进行开发,并从外部YML文件中读取信息并注入到一个bean中:
YML文件的内容如下:
问题在于我无法找到适当的“切片”来隔离测试配置属性。事实上,以下测试将失败:
如何解决这个问题?我是否可以向slice中添加某种初始化程序或类似的东西来使测试成功? 在这里,您可以找到整个GitHub项目。
@Component
@ConfigurationProperties(prefix = "my.conf")
@PropertySource(value = "classpath:ext.yml", factory = YamlPropertySourceFactory.class)
public class MyExternalConfProp {
private String property;
public void setProperty(String property) {
this.property = property;
}
public String getProperty() {
return property;
}
}
我定义了一个自定义工厂来读取外部的YML文件,正如在这篇文章Spring Boot中使用YAML文件的@PropertySource中所述:
public class YamlPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(encodedResource.getResource());
Properties properties = factory.getObject();
return new PropertiesPropertySource(
Objects.requireNonNull(encodedResource.getResource().getFilename()),
Objects.requireNonNull(properties));
}
}
YML文件的内容如下:
my.conf.property: yeyeye
问题在于我无法找到适当的“切片”来隔离测试配置属性。事实上,以下测试将失败:
@SpringBootTest(classes = {MyExternalConfProp.class})
class MyExternalConfPropTest {
@Autowired
private MyExternalConfProp confProp;
@Test
void externalConfigurationPropertyShouldBeLoadedIntoSpringContext() {
assertThat(confProp).hasFieldOrPropertyWithValue("property", "yeyeye");
}
}
就像我们所说的,测试失败并提示以下信息:
java.lang.AssertionError:
Expecting
<in.rcard.externalconfprop.MyExternalConfProp@4cb40e3b>
to have a property or a field named <"property"> with value
<"yeyeye">
but value was:
<null>
然而,如果我不使用任何切片,测试就会成功:
@SpringBootTest
class ExternalConfPropApplicationTests {
@Autowired
private MyExternalConfProp confProp;
@Test
void contextLoads() {
assertThat(confProp).hasFieldOrPropertyWithValue("property", "yeyeye");
}
}
如何解决这个问题?我是否可以向slice中添加某种初始化程序或类似的东西来使测试成功? 在这里,您可以找到整个GitHub项目。