我遇到了一个非常奇怪的问题,有一个jUnit测试和bean代理。作为测试的一部分,我手动将bean添加到应用程序上下文中,并使用AutowireCapableBeanFactory.autowire()
强制bean重新连接以强制进行自动线更新。
如果我在jUnit测试中放置一个断点并检查我自动更新的bean,我可以看到我的字段已经正确更新,并包含我以编程方式添加到上下文中的新bean。
但是,当执行移动到实际的bean并在我正在测试的方法中放置断点时,我添加到上下文中的bean不会出现。
My Bean-under-test方法使用@Transactional
进行注释。如果我删除@Transactional
注释,则会自动更新autowire字段。
我尝试将@Transaction添加到我的jUnit测试方法中,但它没有任何影响。
Junit(实现BeanDefinitionRegistryPostProcessor):
@Test
@Rollback
@Transactional
public void testExecuteSinglePatch() throws Exception {
GenericBeanDefinition definition = new GenericBeanDefinition();
definition.setBeanClass(Patch1.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
definition.setLazyInit(false);
registry.registerBeanDefinition("PATCH_1", definition);
applicationContext.getBeansOfType(Patch.class);
// reinit the patchEngine
autowireBeanFactory.autowireBean(patchEngine);
patchEngine.execute();
assertEquals(1, patchRepository.findByName( new Patch1().getName()).size() );
}
受测试的Bean(PatchEngine):
@Inject private Map<String, Patch> availablePatches;
@Transactional
public void execute() throws Exception{
// loop over all the pending patches, and apply them. Keep looping over while patches exist and at least one patch is applied per iteration
boolean appliedPatch = true;
while( !availablePatches.isEmpty() && appliedPatch ){
// no applied patches this iteration yet
appliedPatch = false;
// do some logic here
}
}
当我将调试上下文设置为jUnit测试并检查patchEngine
时,patchEngine.availablePatches
的bean id与我将调试上下文设置为patchEngine.execute方法时找到的bean id不同。
但是,如果我从@transactional
方法中删除execute()
注释,那么ID就是相同的。
任何人都可以帮我理解发生了什么吗?为什么@Transactional
会影响依赖注入? @Transactional如何影响代理以及如何确保代理正确填充?注释是否会导致使用不同的上下文?有没有办法解决这个问题?
我正在使用Spring 3.2.4.RELEASE和jUnit 4.11。这可能是一个Spring bug吗?