如何让Spring使用多个上下文自动assembly集成测试类?

我的一个集成测试使用多个Spring上下文文件。 似乎Spring只在第一个上下文而不是第二个上下文中自动assemblybean。 有谁知道我做错了什么或如何解决这个问题?

 @RunWith(SpringJUnit4ClassRunner.class)来
 @ContextConfiguration(locations = {
         “类路径:/META-INF/spring/applicationContext.xml”
         “类路径:/META-INF/spring/applicationContext-security.xml”})
 @Configurable
 public class UserDetailsS​​erviceImplIntegrationTest {

     @Autowired
     UserDataOnDemand dod;
     // @Autowired不适用于applicationContext-security.xml中的此bean
     UserDetailsS​​ervice userDetailsS​​ervice;

     @之前
     public void setup(){
         dod.init();
         //自动assembly问题的解决方法
         userDetailsS​​ervice =(UserDetailsS​​ervice)ctx.getBean(“userDetailsS​​ervice”);
     }

     @测试
     public void testLoadUser(){
         UserDetails ud = userDetailsS​​ervice.loadUserByUsername(“david@somewhere.co.za”);
         Assert.assertEquals(“david@somewhere.co.za”,ud.getUsername());
     }
 }

我使用的是Spring 3.0.3。

当我取消注释UserDetailsS​​ervice的@Autowired行时,这是堆栈跟踪:

 org.springframework.beans.factory.BeanCreationException:创建名为'za.co.acme.app.security.UserDetailsS​​erviceImplIntegrationTest'的bean时出错:注入自动连接的依赖项失败; 嵌套exception是org.springframework.beans.factory.BeanCreationException:无法自动assembly字段:org.springframework.security.core.userdetails.UserDetailsS​​ervice za.co.acme.app.security.UserDetailsS​​erviceImplIntegrationTest.userDetailsS​​ervice; 嵌套exception是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[org.springframework.security.core.userdetails.UserDetailsS​​ervice]的匹配bean依赖:预期至少有1个bean符合此依赖关系的autowire候选者。 依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
    在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286)
    在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064)
    在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:374)
    在org.springframework.beans.factory.wiring.BeanConfigurerSupport.configureBean(BeanConfigurerSupport.java:140)
    在org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect.configureBean(AnnotationBeanConfigurerAspect.aj:59)
     at org.springframework.beans.factory.aspectj.AbstractDependencyInjectionAspect.ajc $ afterReturning $ org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect $ 2 $ 1ea6722c(AbstractDependencyInjectionAspect.aj:89)
    在za.co.acme.app.security.UserDetailsS​​erviceImplIntegrationTest。(UserDetailsS​​erviceImplIntegrationTest.java:25)
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    在org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:202)

由于“按名称”查找工作,bean肯定存在,并且它的类型正确。

解决方法是创建一个新的单个配置文件(我们称之为“test-configuration.xml”),该文件包括applicationContext.xml和applicationContext-security.xml。 然后,您可以在测试中使用这些配置。

测试-configuration.xml文件:

     

UserDetailsS​​erviceImplIntegrationTest.java:

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/test-configuration.xml") @Configurable public class UserDetailsServiceImplIntegrationTest { ... } 

我有类似的设置,它对我来说很好。

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/applicationContext-struts.xml", "classpath:/applicationContext.xml" }) @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) @Transactional public abstract class BaseTests { 

我的猜测是问题出在你的项目设置中。 你用Eclipse吗? 它是从/ bin文件夹还是从/ src文件夹加载上下文文件? 您是否从构建中排除了“applicationContext-security.xml”?

我有同样的问题,解决方案修复了我的问题是通过接口切换bean暴露。 (即)您的引用Bean Type应该是Interface而不是它的实现类

在您的情况下,使用其接口更改具体的Class UserDetailsService引用。

例如:

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/META-INF/spring/applicationContext.xml", "classpath:/META-INF/spring/applicationContext-security.xml"}) @Configurable public class UserDetailsServiceImplIntegrationTest { //modified code @Autowired IUserDetailsService userDetailsService; //your test cases follows } 

注意:我知道这不是一个明智的解决方案,但只是试一试,我担心很多因为同样的错误,最后改变了我的参考,它工作正常。 希望它能解决你的问题。

你需要告诉Spring对这些注释采取行动。 在相关的上下文文件中,您应添加以下内容:

  

现在它将扫描那些注释。 请参阅基于注释的配置的Spring文档

要限制它需要扫描的类的数量,以便您不必不必要地扫描没有自动assembly的包,请添加以下内容:

  

有关详细信息,请参阅自动检测组件的文档,以及为引用这些标记而需要添加的XML命名空间。

xml中userDetailsService的bean名称是什么? 您可能需要使用bean名称添加@Qualifier注释,然后在上下文中添加标记。

看看Spring关于该主题的文档 。

我有同样的问题。似乎有一个代理UserDataOnDemand而不是真正的UserDataOnDemand。