根据Spring Boot integration tests不读取属性文件的建议,我创建了以下代码,目的是从我的JUnit测试中的属性读取映射。(我使用的是yml格式,并且使用@configurationproperties而不是@value)
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(locations="classpath:application-test.yml")
@ContextConfiguration(classes = {PropertiesTest.ConfigurationClass.class, PropertiesTest.ClassToTest.class})
public class PropertiesTest {
@Configuration
@EnableConfigurationProperties
static class ConfigurationClass {
}
@ConfigurationProperties
static class ClassToTest {
private String test;
private Map<String, Object> myMap = new HashMap<>();
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
public Map<String, Object> getMyMap() {
return myMap;
}
}
@Autowired
private ClassToTest config;
@Test
public void testStringConfig() {
Assert.assertEquals(config.test, "works!");
}
@Test
public void testMapConfig() {
Assert.assertEquals(config.myMap.size(), 1);
}
}
我的测试配置(在application-test.yml中):
test: works!
myMap:
aKey: aVal
aKey2: aVal2
奇怪的是,弦“起作用了!”从配置文件中成功读取,但未填充映射。
注意:添加映射设置程序会导致以下异常:
Caused by: org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder$RelaxedBeanPropertyBindingResult: 1 errors
Field error in object 'target' on field 'myMap': rejected value []; codes [typeMismatch.target.myMap,typeMismatch.myMap,typeMismatch.java.util.Map,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.myMap,myMap]; arguments []; default message [myMap]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Map' for property 'myMap'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Map' for property 'myMap': no matching editors or conversion strategy found]
at org.springframework.boot.bind.PropertiesConfigurationFactory.checkForBindingErrors(PropertiesConfigurationFactory.java:359)
at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:276)
at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:240)
at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:330)
... 42 more
在使用调试器后,我相信这是TestPropertySourceUtils.addPropertiesFilestoEnvironment()
中的一个bug/缺失特性:
try {
for (String location : locations) {
String resolvedLocation = environment.resolveRequiredPlaceholders(location);
Resource resource = resourceLoader.getResource(resolvedLocation);
environment.getPropertySources().addFirst(new ResourcePropertySource(resource));
}
}
ResourcePropertySource
只能处理.properties
文件,而不能处理.yml
。在常规应用程序中,YamlPropertySourceLoader
注册并可以处理.yml
。
请注意:TestPropertySourceUtils.AddPropertiesFilestoEnvironment()
由以下人员调用:
org.springframework.test.context.support.DelegatingSmartContextLoader.prepareContext()
如果在@contextconfiguration
中没有指定加载程序,则DelegatingSmartContextLoader
是您接收的默认上下文加载程序。(实际上@contextconfiguration
指定接口,但AbstractTestContextBootstrapper.resolvecontextLoader()
将其更改为具体类)
为了解决这个问题,我将配置更改为application-test.properties
,并在测试中使用了该文件。
test=works!
myMap.aKey: aVal
另一个评论:不需要地图上的setter:
我需要测试使用@ConfigurationProperties bean的自动配置类。我正在使用中记录的ApplicationContextRunnerhttps://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-具有测试自动配置功能,可以加快测试速度,避免在每个变体之间启
我正在尝试从application.yml.中检索值下面的最后一行显示kafkaConfig为null,无法读取。如何正确设置Kafka配置和代码以从json文件中读取?我们使用@Data而不是getters/setters。 KafkaConfig.java 应用yml公司 KafkaProducerBeans.java 资源:https://codingnconcepts.com/spring
java.lang.IllegalArgumentException:无法解析字符串值“${cors.hosts.allow}”中的占位符“cors.hosts.allow” 当我这样更改文件时,属性可以被读取,但它自然不包含列表,而只包含一个条目: (我知道我可以将值作为单行读取,并将它们按拆分,但我还不想采用变通方法) 这也不起作用(尽管我认为根据snakeyamls文档,这应该是有效的):
我是Java world和Spring Boot的新手,我正在尝试通过注释访问位于YAML文件中的一些配置值。 但是每当我试图访问服务中任何地方的配置值时,我得到的是一个空值。 下面是配置类: 使用它的验证器服务: 我还在主类中添加了注释。
我想创建一个yaml文件,从中获取常量 ConstantConfiguration。yml公司 配置类如下所示: 这是一个我想要如何使用它的虚拟示例 <代码>恒定属性。getMyList()始终为空我使用的是spring boot:2.5.12和java 11