Dav*_*ker 17 java junit spring
我的一个集成测试使用多个Spring上下文文件.似乎Spring只在第一个上下文而不是第二个上下文中自动装配bean.有谁知道我做错了什么或如何解决这个问题?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:/META-INF/spring/applicationContext.xml",
"classpath:/META-INF/spring/applicationContext-security.xml"})
@Configurable
public class UserDetailsServiceImplIntegrationTest {
@Autowired
UserDataOnDemand dod;
// @Autowired does not work for this bean from applicationContext-security.xml
UserDetailsService userDetailsService;
@Before
public void setup() {
dod.init();
// workaround for autowiring problem
userDetailsService = (UserDetailsService)ctx.getBean("userDetailsService");
}
@Test
public void testLoadUser() {
UserDetails ud = userDetailsService.loadUserByUsername("david@somewhere.co.za");
Assert.assertEquals("david@somewhere.co.za", ud.getUsername());
}
}
我正在使用Spring 3.0.3.
当我取消注释UserDetailsService的@Autowired行时,这是堆栈跟踪:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'za.co.acme.app.security.UserDetailsServiceImplIntegrationTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.security.core.userdetails.UserDetailsService za.co.acme.app.security.UserDetailsServiceImplIntegrationTest.userDetailsService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.security.core.userdetails.UserDetailsService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:374)
at org.springframework.beans.factory.wiring.BeanConfigurerSupport.configureBean(BeanConfigurerSupport.java:140)
at 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)
at za.co.acme.app.security.UserDetailsServiceImplIntegrationTest.(UserDetailsServiceImplIntegrationTest.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)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:202)
由于"按名称"查找工作,bean肯定存在,并且它的类型正确.
解决方法是创建一个新的单个配置文件(我们称之为"test-configuration.xml"),该文件包括applicationContext.xml和applicationContext-security.xml.然后,您可以在测试中使用这些配置.
测试-configuration.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<import resource="classpath:/META-INF/spring/applicationContext.xml"/>
<import resource="classpath:/META-INF/spring/applicationContext-security.xml"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
UserDetailsServiceImplIntegrationTest.java:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/test-configuration.xml")
@Configurable
public class UserDetailsServiceImplIntegrationTest {
...
}
Run Code Online (Sandbox Code Playgroud)
你的 xml 中的 bean 的名称是什么userDetailsService?您可能需要添加@Qualifier带有 bean 名称的注释,然后<qualifier>在上下文中添加一个标签。
查看有关该主题的Spring 文档。
| 归档时间: |
|
| 查看次数: |
43318 次 |
| 最近记录: |