2012-12-31 47 views
1

真的需要帮助。我使用JUnit(4.6)和Spring(3.0.5)进行单元测试。当我尝试在我的测试类中自动装入服务对象时,出现NoSuchBeanDefinitionException异常。@ JUnit&Spring的自动失败

JUnit的代码:

package com.aaa.service.impl; 

@ContextConfiguration(locations = { "classpath:/spring/applicationContext.xml", 
    "classpath:/spring/applicationContext-aop.xml", 
    "classpath:/spring/applicationContext-dao.xml", 
    "classpath:/spring/applicationContext-service.xml" }) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class TestManageTargetServiceImpl { 

    @Autowired 
    ManageTargetServiceImpl manageTargetServiceImpl; 

    @Test 
    public void testQueryFinancialMonthList() { 
     List<Map<String, Object>> value = new ArrayList<Map<String, Object>>(); 
     ManageTargetDao manageTargetDao = mock(ManageTargetDao.class); 
     when(manageTargetDao.queryFinancialMonthList()).thenReturn(value); 
     manageTargetServiceImpl.setManageTargetDao(manageTargetDao); 
     // I hope it return null 
     assertNull(manageTargetServiceImpl.queryFinancialMonthList()); 
    } 
} 

ApplicationContext的-service.xml的代码:

<context:annotation-config /> 

<bean id="manageTargetService" class="com.aaa.service.impl.ManageTargetServiceImpl"> 
    <property name="manageTargetDao" ref="manageTargetDao"></property> 
</bean> 

错误的轨道:

00:51:28,625 ERROR main context.TestContextManager:324 - Caught exception while allowing TestExecutionListener [org.springframewor[email protected]882dfc] to prepare test instance [[email protected]] 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.aaa.service.impl.TestManageTargetServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.aaa.service.impl.ManageTargetServiceImpl com.aaa.service.impl.TestManageTargetServiceImpl.manageTargetServiceImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.aaa.service.impl.ManageTargetServiceImpl] 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)} 

某些日志:

00:51:26,828 DEBUG main context.TestContextManager:282 - beforeTestClass(): class [class com.aaa.service.impl.TestManageTargetServiceImpl] 
00:51:26,828 DEBUG main annotation.ProfileValueUtils:68 - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.aaa.service.impl.TestManageTargetServiceImpl] 
00:51:26,828 DEBUG main annotation.ProfileValueUtils:80 - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.aaa.service.impl.TestManageTargetServiceImpl] 
00:51:26,828 DEBUG main context.TestContextManager:315 - prepareTestInstance(): instance [[email protected]] 
00:51:26,843 DEBUG main support.DependencyInjectionTestExecutionListener:73 - Performing dependency injection for test context [[[email protected] testClass = TestManageTargetServiceImpl, locations = array<String>['classpath:/spring/applicationContext.xml', 'classpath:/spring/applicationContext-aop.xml', 'classpath:/spring/applicationContext-dao.xml', 'classpath:/spring/applicationContext-service.xml'], testInstance = [email protected], testMethod = [null], testException = [null]]]. 
00:51:26,843 DEBUG main support.AbstractGenericContextLoader:75 - Loading ApplicationContext for locations [classpath:/spring/applicationContext.xml,classpath:/spring/applicationContext-aop.xml,classpath:/spring/applicationContext-dao.xml,classpath:/spring/applicationContext-service.xml]. 
00:51:26,968 INFO main xml.XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [spring/applicationContext.xml] 
00:51:27,187 INFO main xml.XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [spring/applicationContext-aop.xml] 
00:51:27,312 INFO main xml.XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [spring/applicationContext-dao.xml] 
00:51:27,421 INFO main xml.XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [spring/applicationContext-service.xml] 
00:51:27,453 INFO main support.GenericApplicationContext:456 - Refreshing [email protected]c14e7: startup date [Tue Jan 01 00:51:27 NZDT 2013]; root of context hierarchy 
00:51:27,718 INFO main config.PropertyPlaceholderConfigurer:177 - Loading properties file from class path resource [jdbc.properties] 
00:51:27,796 INFO main support.DefaultListableBeanFactory:555 - Pre-instantiating singletons in org.s[email protected]2938d8: defining beans [loggingAop,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,service,loginDao,manageTargetDao,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,dataSource,txManager,txAdvice,txDAO,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,loginService,manageTargetService]; root of factory hierarchy 
+0

您确定stacktrace中没有其他错误吗?也许manageTargetService不能在容器中因为一些错误等而创建(或者因为没有找到manageTargetDao - 它必须是可用的,因为它在xml中被指定为属性) –

+1

在这里猜测 - 但是如果注入一个类类型' ManageTargetServiceImpl'失败,我认为原因是为'ManageTargetServiceImpl'创建了一个代理,所以bean的类型不再是'ManageTargetServiceImpl',而是该类的接口。 –

+0

嗨,Biju,你是对的,谢谢。我添加了aop方法并在'ManageTargetServiceImpl'上声明了事务。而我只是试图去除aops,@Autowired的作品。谢谢! @Biju Kunjummen – Albert

回答

0

这里猜测 - 但考虑到类类型ManageTargetServiceImpl失败的注入,我想原因是,这是获得了创建代理ManageTargetServiceImpl等bean的类型将不再是ManageTargetServiceImpl,而是该类的接口。

from Biju Kunjummen

+0

Biju Kunjummen是正确的。我添加了aop方法并在ManageTargetServiceImpl上声明了事务。删除aops后,@Autowired运行良好。 – Albert

0

看看你的property id。它应该是manageTargetServiceImplapplicationContext-service.xml

它改成这样:

<bean id="manageTargetServiceImpl" class="com.aaa.service.impl.ManageTargetServiceImpl"> 
    <property name="manageTargetDao" ref="manageTargetDao"></property> 
</bean> 
+0

嗨,马丁,谢谢你的回复。但是,我更改了id,但仍然无法处理相同的异常。此外,我认为@Autowired的默认汽车线类型是byType。 – Albert

+0

你使用了多个'applicationContext'文件吗?确保它们可以使用'

+0

'@ Autowired'总是使用by-type布线 –