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