在spring、spock和groovy的测试中注入@value失败

y3bcpkx1  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(670)

我注射有问题 @Value('${mybean.secret}') 在spock和spring-boot&groovy的测试中,将属性添加到我的bean中。
我有一个非常简单的测试班 MyBeanTest ```
@ContextConfiguration(classes = [
MyAppConfig
])
@PropertySource([
"classpath:context/default-properties.yml"
])
class MyBeanTest extends Specification {

@Autowired
MyBean myBean

def "should populate properties "() {
    expect:
        myBean.secretProperty == "iCantTellYou"
}

}

以及 `MyAppConfig.groovy` 因此:

@Configuration
class MyAppConfig {

@Bean
MyBean credential(@Value('${mybean.secret}') String secret) {
    return new MyBean(secret)
}

}

当我运行测试时 `value` 注射到 `secret` 只是 `${mybean.secret}` . 真正的价值不是从 `properties` 随函附上测试规范文件。
我用的是单引号 `@Value` 因为groovy。双倍 `quote` 与 `$` 符号使它由groovy gstring机制处理。
但是,该问题不会在常规应用程序运行时发生。
如果我启动应用程序并将断点放在 `MyAppConfig#credential` 方法 `secret` 从属性文件中正确读取值,其配置如下:

@Configuration
@PropertySource(["classpath:context/default-properties.yml"])
class PropertiesConfig {
}

当我这样从手上指定属性时:

@TestPropertySource(properties = [
"mybean.secret=xyz"
])
class MyBeanTest extends Specification {

它起作用了。属性已读取。但这并不是我的目标,因为项目中有更多的属性,从手边到处定义它们会变得很麻烦。
你能找出我在这段代码中遗漏的问题吗?
ktecyv1j

ktecyv1j1#

丢失的拼图是yamlpropertysourcefactory。

public class YamlPropertySourceFactory implements PropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) 
      throws IOException {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(encodedResource.getResource());

        Properties properties = factory.getObject();

        return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
    }
}

我用的是 yml 具有嵌套属性的属性文件:

mybean:
  secret: xyz

Spring没有正确加载。
我得更新一下 @PropertySource 注解如下:

@Configuration
@PropertySource(
    value = ["classpath:context/default-properties.yml"],
  factory = YamlPropertySourceFactory.class
)
class PropertiesConfig {
}

现在它就像一个魔咒?。
我是在baeldung网站上学到的=>https://www.baeldung.com/spring-yaml-propertysource

相关问题