spring中JUnit4测试中,AbstractTransactionalJUnit4SpringContextTests报错关于javax.sql.DataSource

本文讨论了在使用Spring集成测试时遇到找不到dataSource的问题,并提供了两种解决方案:不使用AbstractTransactionalJUnit4SpringContextTests直接测试,或者在applicationContext.xml中配置dataSource。详细解释了原因及实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天使用AbstractTransactionalJUnit4SpringContextTests,进行spring集成的hibernat测试

package bijian.model.dao.hibernateImpl;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;

import bijian.model.bean.User;
import bijian.model.dao.IUserDao;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring.xml"})
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
public class UserDaoImplTests extends AbstractTransactionalJUnit4SpringContextTests{
	@Resource(name="userDao",type=UserDaoImpl.class)
    private IUserDao userDao;
	
	@Rollback(false)
	@Test
	public void testInsert(){//T entity
		User user=new User();
		user.setUsername("jazywoo");
		user.setNickname("wujianzhi");
		user.setPassword("123456");
		userDao.insert(user);
		System.out.println(user.getUserID());
		Assert.assertNotNull("userID not null", user.getUserID());
	}
    }
	@Test
	public void testGetByUsername(){//String username
		User user=new User();
		user.setUsername("jazywoo");
		user.setNickname("wujianzhi");
		user.setPassword("123456");
		userDao.insert(user);
		String username="jazywoo";
		User user2=(User) userDao.get(username);
		System.out.println(user.getUserID());
		Assert.assertNotNull(user2);
	}
    
}

于是报错是

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests.setDataSource(javax.sql.DataSource); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:601)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
	... 26 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:949)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:818)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:730)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:558)
	... 28 more
原因是找不到配合文件中的dataSource,由于集成的hibernate,使用的是hibernate.hbm.xml的配置信息,没有配置dataSource;

解决方法有两种,

一种是去掉AbstractTransactionalJUnit4SpringContextTests,不继承,可以直接测试,但是使用@Rollback(false)的时候,事件还是会回滚。

一种是是在appplicationContext.xml中配置上dateSource数据源,这时候使用@Rollback(false)的时候,事件才不会回滚,会写入数据库。

<?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.xsd">
     
	    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
	        <property name="url" value="jdbc:mysql://localhost/db_sentence" />
	        <property name="username" value="root" />
	        <property name="password" value="admin" />     
	    
	    </bean>
	     <!-- 定义sessionFactory -->
	    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	       <property name="configLocations">
			  <value>classpath:hibernate.cfg.xml</value>
		   </property>
	    </bean>
	    
	    <!-- 定义事务管理器:此处的含义就是下面的事务管理器管理由sessionFactory创建的session -->
	    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	        <property name="sessionFactory" ref="sessionFactory" />
	    </bean>
	    
	    <!-- HibernateTemplate类是Spring提供给我们进行Hibernate持久层操作的类,它对增删查改方法进行了封装 -->
	    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
      

       <bean id="userDao" class="bijian.model.dao.hibernateImpl.UserDaoImpl">
            <property name="hibernateTemplate" ref="hibernateTemplate"/>
       </bean>
       <bean id="userRelatedObjectDao" class="bijian.model.dao.hibernateImpl.UserRelatedObjectDaoImpl">
            <property name="hibernateTemplate" ref="hibernateTemplate"/>
       </bean>
       

</beans>



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值