`
hehaibo
  • 浏览: 409201 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

No bean named transactionManager is defined 多数据源的单元测试

 
阅读更多

spring 相关的配置

<!--  -->
	<bean id="car_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		lazy-init="default" dependency-check="default">
		<property name="driverClass">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="jdbcUrl">
			<value>${jdbc.url}</value>
		</property>
		<property name="user">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
		<property name="minPoolSize" value="2" />
		<property name="maxPoolSize" value="5" />
		<property name="initialPoolSize" value="2" />
		<property name="maxIdleTime" value="30000" />
		<property name="acquireIncrement" value="1" />
		<property name="idleConnectionTestPeriod" value="1800" />
		<property name="acquireRetryAttempts" value="30" />
		<property name="breakAfterAcquireFailure" value="true" />
		<property name="testConnectionOnCheckout" value="false" />
		<property name="properties">
			<props>
				<prop key="bigStringTryClob">true</prop>
				<prop key="clientEncoding">GBK</prop>
				<prop key="serverEncoding">GBK</prop>
			</props>
		</property>
	</bean>
	<bean id="biap_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		lazy-init="default" dependency-check="default">
		<property name="driverClass">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="jdbcUrl">
			<value>${jdbc.url}</value>
		</property>
		<property name="user">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
		<property name="minPoolSize" value="2" />
		<property name="maxPoolSize" value="5" />
		<property name="initialPoolSize" value="2" />
		<property name="maxIdleTime" value="30000" />
		<property name="acquireIncrement" value="1" />
		<property name="idleConnectionTestPeriod" value="1800" />
		<property name="acquireRetryAttempts" value="30" />
		<property name="breakAfterAcquireFailure" value="true" />
		<property name="testConnectionOnCheckout" value="false" />
		<property name="properties">
			<props>
				<prop key="bigStringTryClob">true</prop>
				<prop key="clientEncoding">GBK</prop>
				<prop key="serverEncoding">GBK</prop>
			</props>
		</property>
	</bean>

	<aop:config>
			<aop:advisor pointcut="execution(* com.hhb.biap.*.service..*.*(..))"
				advice-ref="biap_txAdvice" />
		</aop:config>

		<tx:advice id="biap_txAdvice" transaction-manager="biap_transactionManager" >
			<tx:attributes>
				<tx:method name="create*" />
				<tx:method name="modify*" />
				<tx:method name="insert*" />
				<tx:method name="update*" />
				<tx:method name="delete*" />
				<tx:method name="*" read-only="true" />
			</tx:attributes>
		</tx:advice>
		
		<aop:config>
			<aop:advisor pointcut="execution(* com.hhb.car.*.service..*.*(..))"
				advice-ref="car_txAdvice" />
		</aop:config>

		<tx:advice id="car_txAdvice" transaction-manager="car_transactionManager" >
			<tx:attributes>
				<tx:method name="create*" />
				<tx:method name="modify*" />
				<tx:method name="insert*" />
				<tx:method name="update*" />
				<tx:method name="delete*" />
				<tx:method name="*" read-only="true" />
			</tx:attributes>
		</tx:advice>

 单元测试类:

@ContextConfiguration(locations = {"classpath:spring/common/dataSource.xml","classpath:spring/common/applicationContext.xml",
		"classpath:spring/car/car.xml","classpath:spring/car/car-dao.xml",
		"classpath:spring/biap/biap.xml","classpath:spring/biap/biap-dao.xml"})
public abstract class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {
       //自动装配默认是根据类型类匹配的,用@Qualifier 可以指定具体的数据源
       @Autowired
	public void setDataSource(@Qualifier("car_dataSource") DataSource dataSource) {
		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}

}
public class BasedaoTest extends BaseTest{
	@Resource(name="carBaseDAO")
	BaseDAO carBaseDAO;
	private String namespace="car_type.";
	@Test
	public void batchDelete() {
		List<Integer> list=new ArrayList<Integer>();
		for (int i=2;i<10;i++) {
			list.add(i);
		}
		this.carBaseDAO.batchDelete(namespace, "deleteCarType", list);
	}
} 

 运行之后报错

[WARN ] 2012-07-06 10:58:20 :Caught exception while retrieving transaction manager with bean name [transactionManager] for test context [[TestContext@d12eea testClass = BasedaoTest, locations = array<String>['classpath:spring/common/dataSource.xml', 'classpath:spring/common/applicationContext.xml', 'classpath:spring/car/car.xml', 'classpath:spring/car/car-dao.xml', 'classpath:spring/biap/biap.xml', 'classpath:spring/biap/biap-dao.xml'], testInstance = com.hhb.car.dao.test.BasedaoTest@15f157b, testMethod = batchDelete@BasedaoTest, testException = [null]]]
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146)
	at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270)
	at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
	at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
[WARN ] 2012-07-06 10:58:20 :Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@b6ef8] to process 'before' execution of test method [public void com.hhb.car.dao.test.BasedaoTest.batchDelete()] for test instance [com.hhb.car.dao.test.BasedaoTest@15f157b]
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146)
	at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270)
	at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
	at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

 经过断点跟踪调试:

 

org.springframework.test.context.transaction.TransactionalTestExecutionListener
private TransactionConfigurationAttributes retrieveTransactionConfigurationAttributes(Class<?> clazz) {
		Class<TransactionConfiguration> annotationType = TransactionConfiguration.class;
		TransactionConfiguration config = clazz.getAnnotation(annotationType);
		if (logger.isDebugEnabled()) {
			logger.debug("Retrieved @TransactionConfiguration [" + config + "] for test class [" + clazz + "]");
		}

		String transactionManagerName;
		boolean defaultRollback;
		if (config != null) {
			transactionManagerName = config.transactionManager();
			defaultRollback = config.defaultRollback();
		}
		else {
			transactionManagerName = (String) AnnotationUtils.getDefaultValue(annotationType, "transactionManager");
			defaultRollback = (Boolean) AnnotationUtils.getDefaultValue(annotationType, "defaultRollback");
		}

		TransactionConfigurationAttributes configAttributes =
				new TransactionConfigurationAttributes(transactionManagerName, defaultRollback);
		if (logger.isDebugEnabled()) {
			logger.debug("Retrieved TransactionConfigurationAttributes [" + configAttributes + "] for class [" + clazz + "]");
		}
		return configAttributes;
	}
 
 

 默认它会加上事务,事务管理默认的bean名称是transactionManager,因为配置中没有这个bean 的配置,所以抛出异常,这个        TransactionConfiguration config = clazz.getAnnotation(annotationType);
我们没有在测试类上注释,所以为null,去取默认的transactionManager。

我们可以这样做

@TransactionConfiguration(transactionManager="car_transactionManager")
public class BasedaoTest extends BaseTest{

}

 

 

分享到:
评论
3 楼 xintangchao 2015-03-03  
谢谢,但我加个注解后为什么测试类运行正常,但数据却没有插入到数据库呢。
2 楼 hehaibo 2013-09-22  
goahead2010 写道
大谢,测试事务时出现了。

不客气
1 楼 goahead2010 2013-08-23  
大谢,测试事务时出现了。

相关推荐

    2771885 - TransactionManager is not ready

    SAP NOTE TransactionManager Index server is in the process of starting up and taking too long.

    基于单片机的水位测量设计

    单片机STC89C52设计水位测量 压强感应 数码管显示

    ssh框架在application.xml中配置数据源所需jar

    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;ref bean="sessionFactory"/&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 配置事务的传播特性 --&gt; ...

    Spring3.0配置多个事务管理器的方法

    Spring3.0配置多个事务管理器(即操作多个数据源)的方法 大多数项目只需要一个事务管理器。然而,有些项目为了提高效率、或者有多个完全不同又不相干的数据源,最好用多个事务管理器。机智的Spring的Transactional...

    JTA事务源码示例

    -- 数据源A --&gt; &lt;bean id="dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"&gt; &lt;bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method=...

    SSH整合&&SSH集成开发

    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;/bean&gt; &lt;!-- JTA环境的事务配置 &lt;bean id="transactionManager" class="org.springframework....

    基于框架的Web开发-基于注解的事务配置.doc

    其余和切面、通知有关的配置都注释掉,或者删掉这个属性值引用前面定义的transactionManager bean添加保留 其余和切面、通知有关的配置都注释掉,或者删掉 这个属性值引用前面定义的transactionManager bean 添加 ...

    ssmDemo1:SSM框架整合练习项目 来自《2017-7黑马49期web》

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in file [F:\IdeaProjects\ssmDemo1\out\artifacts\ssmDemo1_war_exp

    Myeclipse6.0中SSH框架搭建

    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;property name="sessionFactory" ref="sessionFactory"&gt;&lt;/property&gt; &lt;/bean&gt; &lt;!-- 其它Bean定义...

    spring五种事务配置demo

    DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。...

    spring applicationContext 配置文件

    &lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager " p:dataSource-ref="dataSourceProxy"/&gt; &lt;!-- 配置事务的传播特性 --&gt; ...

    开源项目-Code-Hex-sqlx-transactionmanager.zip

    开源项目-Code-Hex-sqlx-transactionmanager.zip,Transaction manager extends github.com/jmoiron/sqlx

    Activiti6.0教程例子下载

    之后编写一个简单的单元测试,主要为了测试activiti.cfg.xml配置的是否正确,流程是否可以被部署即可。 至于与Spring的集成,一定要熟悉基于Spring配置Activiti,以及事务的处理。 3. 入门示例(参考手册中10分钟...

    Struts2+Spring3+MyBatis3完整实例

    网上的东西好大多都不能直接用,自己结合网上资料做了一个Struts2+Spring3+MyBatis3的测试工程,JUnit测试用例和WEB服务。 内涵完整jar包,解压直接可用,包括一个表文件。 Eclipse3.2+Tomcat/5.5+jdk1.5.0_17 - ...

    jdbc——内嵌事务

    &lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt; &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt; &lt;/bean&gt; &lt;bean id="departmentDao...

    三大框架下分页源代码

    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;ref bean="sessionFactory"/&gt; &lt;/bean&gt; &lt;!-- 新闻类型 --&gt; &lt;bean id="newsclassDAO" class=...

    iBATIS实战

    13.1.3 对DAO的消费层进行单元测试 235 13.2 管理iBATIS配置文件 237 13.2.1 将其保存在类路径上 237 13.2.2 集中放置文件 238 13.2.3 主要按返回类型来组织映射文件 239 13.3 命名规范 239 13.3.1 语句的命名 239 ...

    spring3.2+strut2+hibernate4

    -- 数据源配置,主要用于开发测试环境 --&gt; &lt;!-- &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt; --&gt; &lt;bean id="dataSource" class="org.apache.commons.dbcp....

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;/bean&gt; &lt;!-- 配置事务拦截器--&gt; &lt;bean id="transactionInterceptor" class="org.spring...

    OA项目SSH整合框架

    2,单元测试 @Test // 测试声明式事务 public void testTransaction() { InsertUserService service = (InsertUserService) ac.getBean("insertUserService"); service.addUsers(); } 3,...

Global site tag (gtag.js) - Google Analytics