编程语言
首页 > 编程语言> > java – 我应该将配置类注释为@Configuration进行测试吗?

java – 我应该将配置类注释为@Configuration进行测试吗?

作者:互联网

我花了一些时间解决Spring Data中缺少org.joda.time.DateTime-> java.util.Date转换器的问题(当Joda-Time在类路径上时应该默认启用).我找到了一个原因,但它在Spring中产生了一个关于@Configuration注释的问题.

使用spring-data-mongodb中的AbstractMongoConfiguration进行标准应用程序配置:

@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

显式使用AppConfig类的测试(使用Spock,但使用spring-test提供的内部机制):

@ContextConfiguration(classes = AppConfig)
class JodaDocRepositorySpec extends Specification {

    @Autowired
    private JodaDocRepository jodaDocRepository

    def "save document with DateTime"() {
        given:
            def jodaDoc = new JodaDoc(DateTime.now())
        when:
            def savedJodaDoc = jodaDocRepository.save(jodaDoc)
        then:
            savedJodaDoc.id
    }
}

它工作正常.但是当删除/评论AppConfig中的@Configuration注释时:

//@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

测试失败了:

org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type org.joda.time.DateTime to type java.util.Date

AFAIK在上下文中显式注册时,不需要将@Configuration用于配置类(通过@ContextConfiguration中的类或AnnotationConfigWebApplicationContext中的register()方法).无论如何都要处理这些类,并找到所有声明的bean.当在不同测试使用的测试上下文中的相同包中存在2个类似的配置类时,不使用@Configuration来防止通过组件扫描进行检测是有用的.

因此我认为它可能是Spring中的一个错误,它会导致上下文中的不同内部bean处理,具体取决于用法或@Configuration注释.我比较了这两种情况下的Spring日志并且存在一些差异,但是我无法确定它们在Spring内部类中引起的是什么.在提交错误之前,我想问一下:

我的问题.是否存在可解释的原因,为什么Spring对于相同的配置类(在@ContextConfiguration中明确指出)根据@Configuration注释的存在使用(或不使用)Joda-Time转换器?

我还创建了一个quickstart project再现问题. spring-data-mongodb 1.3.3,spring 4.0.0,joda-time 2.3.

解决方法:

这种行为一切都还可以. AbstractMongoConfiguration由@Configuration注释,但实际上这个注释不是@Inherited,因此您必须明确注释您的类.

删除@Configuration批注时,AppConfig类不是完整配置.它只是因为它包含@Bean注释的方法而作为精简配置进行处理 – 请参考org.springframework.context.annotation.ConfigurationClassUtils中的方法

> isFullConfigurationCandidate()
> isLiteConfigurationCandidate()
> isFullConfigurationClass()

最后,只有完整的(由@Configuration注释)配置类是进程并由配置后处理器增强 – 查看ConfigurationClassPostProcessor.enhanceConfigurationClasses()

标签:java,spring,spring-data,integration-testing,spring-java-config
来源: https://codeday.me/bug/20190629/1323632.html