2011-05-24 74 views
1

我想写我的DAO类单元测试,但事情是我得到这个错误:春3单元测试

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.yeah.server.dao.UserDAOTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.yeah.server.dao.UserDAO com.yeah.server.dao.UserDAOTest.userDAO; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.yeah.server.dao.UserDAO] 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)} 

这是我的applicationContext文件

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

<bean id="hibernateTemplate"  class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory" /> 
    </property> 
</bean> 
<context:annotation-config /> 
    <context:component-scan base-package="com.yeah.server.*" /> 
    <aop:aspectj-autoproxy /> 

<!--Mysql database connection info--> 
<bean name="dataSource" id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
<property name="url" value="jdbc:mysql://192.168.1.4:3306/YeaH"/> 
<property name="username" value="root"/> 
<property name="password" value=""/> 
</bean> 

<!-- Hibernate --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingResources"> 
    <list> 
     <value>com/yeah/shared/model/User.hbm.xml</value> 
     <value>com/yeah/shared/model/Comment.hbm.xml</value> 
     <value>com/yeah/shared/model/Album.hbm.xml</value> 
     <value>com/yeah/shared/model/Picture.hbm.xml</value> 
    </list> 
    </property> 
    <property name="hibernateProperties"> 
    <props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.hbm2ddl.auto">update</prop> 
    </props> 
    </property> 
    </bean> 
    <!-- Gilead --> 
    <bean id="proxySerializer"  class="net.sf.gilead.core.serialization.GwtProxySerialization" /> 

<bean id="proxyStore" class="net.sf.gilead.core.store.stateless.StatelessProxyStore"> 
<property name="proxySerializer" ref="proxySerializer" /> 
</bean> 

<bean id="persistenceUtil" class="net.sf.gilead.core.hibernate.HibernateUtil"> 
<property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<bean id="persistentBeanManager" class="net.sf.gilead.core.PersistentBeanManager"> 
    <property name="proxyStore" ref="proxyStore"/> 
    <property name="persistenceUtil" ref="persistenceUtil"/> 
</bean> 

<!-- a PlatformTransactionManager is still required --> 
    <bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 
    </beans> 

而这里的我的测试文件

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:**/applicationContext.xml"}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback =  false) 
@Transactional 
public class UserDAOTest { 

private static Logger log = Logger.getLogger(UserDAOTest.class); 
@Autowired 
private UserDAO userDAO; 

@Test 
public void getItemById() { 

    User user = null; 
    long id = 1; 
    user = userDAO.getItemById(id); 
    assertNotNull(user); 

} 
} 
+1

灿你发布UserDAO?此外,如果你可以修复堆栈跟踪的格式,可能会有所帮助。 – abalogh 2011-05-24 15:17:52

回答

7

No matching bean of type [com.yeah.server.dao.UserDAO] found for dependency

你的组件扫描LO ok stange: <context:component-scan base-package="com.yeah.server.*" />

它应该是一个包而不是一个模式。 尝试:<context:component-scan base-package="com.yeah.server" />

+0

的确,这就是为什么它被称为* base * -package。这是扫描开始的包。 – 2011-05-24 14:16:03

4

这是一个猜测,但:

<context:component-scan base-package="com.yeah.server.*" /> 

确实应该

<context:component-scan base-package="com.yeah.server" /> 

随着出.*它不是一个路线,只需一个包名

+0

不行,仍然是同样的问题。 – karq 2011-05-24 14:44:26

+1

好吧,它在那里。应用程序上下文没有找到任何实现UserDAO的bean。选择非常渺茫,要么它不在'com.yeah.server'中,要么它没有用@ Component' @ Repository'注释,所以被组件扫描忽略。 – 2011-05-24 15:28:46