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

spring 相关的配置

Xml代码   收藏代码
  1. <!--  -->  
  2.     <bean id="car_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  3.         lazy-init="default" dependency-check="default">  
  4.         <property name="driverClass">  
  5.             <value>${jdbc.driverClassName}</value>  
  6.         </property>  
  7.         <property name="jdbcUrl">  
  8.             <value>${jdbc.url}</value>  
  9.         </property>  
  10.         <property name="user">  
  11.             <value>${jdbc.username}</value>  
  12.         </property>  
  13.         <property name="password">  
  14.             <value>${jdbc.password}</value>  
  15.         </property>  
  16.         <property name="minPoolSize" value="2" />  
  17.         <property name="maxPoolSize" value="5" />  
  18.         <property name="initialPoolSize" value="2" />  
  19.         <property name="maxIdleTime" value="30000" />  
  20.         <property name="acquireIncrement" value="1" />  
  21.         <property name="idleConnectionTestPeriod" value="1800" />  
  22.         <property name="acquireRetryAttempts" value="30" />  
  23.         <property name="breakAfterAcquireFailure" value="true" />  
  24.         <property name="testConnectionOnCheckout" value="false" />  
  25.         <property name="properties">  
  26.             <props>  
  27.                 <prop key="bigStringTryClob">true</prop>  
  28.                 <prop key="clientEncoding">GBK</prop>  
  29.                 <prop key="serverEncoding">GBK</prop>  
  30.             </props>  
  31.         </property>  
  32.     </bean>  
  33.     <bean id="biap_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  34.         lazy-init="default" dependency-check="default">  
  35.         <property name="driverClass">  
  36.             <value>${jdbc.driverClassName}</value>  
  37.         </property>  
  38.         <property name="jdbcUrl">  
  39.             <value>${jdbc.url}</value>  
  40.         </property>  
  41.         <property name="user">  
  42.             <value>${jdbc.username}</value>  
  43.         </property>  
  44.         <property name="password">  
  45.             <value>${jdbc.password}</value>  
  46.         </property>  
  47.         <property name="minPoolSize" value="2" />  
  48.         <property name="maxPoolSize" value="5" />  
  49.         <property name="initialPoolSize" value="2" />  
  50.         <property name="maxIdleTime" value="30000" />  
  51.         <property name="acquireIncrement" value="1" />  
  52.         <property name="idleConnectionTestPeriod" value="1800" />  
  53.         <property name="acquireRetryAttempts" value="30" />  
  54.         <property name="breakAfterAcquireFailure" value="true" />  
  55.         <property name="testConnectionOnCheckout" value="false" />  
  56.         <property name="properties">  
  57.             <props>  
  58.                 <prop key="bigStringTryClob">true</prop>  
  59.                 <prop key="clientEncoding">GBK</prop>  
  60.                 <prop key="serverEncoding">GBK</prop>  
  61.             </props>  
  62.         </property>  
  63.     </bean>  
  64.   
  65.     <aop:config>  
  66.             <aop:advisor pointcut="execution(* com.hhb.biap.*.service..*.*(..))"  
  67.                 advice-ref="biap_txAdvice" />  
  68.         </aop:config>  
  69.   
  70.         <tx:advice id="biap_txAdvice" transaction-manager="biap_transactionManager" >  
  71.             <tx:attributes>  
  72.                 <tx:method name="create*" />  
  73.                 <tx:method name="modify*" />  
  74.                 <tx:method name="insert*" />  
  75.                 <tx:method name="update*" />  
  76.                 <tx:method name="delete*" />  
  77.                 <tx:method name="*" read-only="true" />  
  78.             </tx:attributes>  
  79.         </tx:advice>  
  80.           
  81.         <aop:config>  
  82.             <aop:advisor pointcut="execution(* com.hhb.car.*.service..*.*(..))"  
  83.                 advice-ref="car_txAdvice" />  
  84.         </aop:config>  
  85.   
  86.         <tx:advice id="car_txAdvice" transaction-manager="car_transactionManager" >  
  87.             <tx:attributes>  
  88.                 <tx:method name="create*" />  
  89.                 <tx:method name="modify*" />  
  90.                 <tx:method name="insert*" />  
  91.                 <tx:method name="update*" />  
  92.                 <tx:method name="delete*" />  
  93.                 <tx:method name="*" read-only="true" />  
  94.             </tx:attributes>  
  95.         </tx:advice>  

 单元测试类:

Java代码   收藏代码
  1. @ContextConfiguration(locations = {"classpath:spring/common/dataSource.xml","classpath:spring/common/applicationContext.xml",  
  2.         "classpath:spring/car/car.xml","classpath:spring/car/car-dao.xml",  
  3.         "classpath:spring/biap/biap.xml","classpath:spring/biap/biap-dao.xml"})  
  4. public abstract class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {  
  5.        //自动装配默认是根据类型类匹配的,用@Qualifier 可以指定具体的数据源  
  6.        @Autowired  
  7.     public void setDataSource(@Qualifier("car_dataSource") DataSource dataSource) {  
  8.         this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);  
  9.     }  
  10.   
  11. }  
  12. public class BasedaoTest extends BaseTest{  
  13.     @Resource(name="carBaseDAO")  
  14.     BaseDAO carBaseDAO;  
  15.     private String namespace="car_type.";  
  16.     @Test  
  17.     public void batchDelete() {  
  18.         List<Integer> list=new ArrayList<Integer>();  
  19.         for (int i=2;i<10;i++) {  
  20.             list.add(i);  
  21.         }  
  22.         this.carBaseDAO.batchDelete(namespace, "deleteCarType", list);  
  23.     }  
  24. }   

 运行之后报错

Java代码   收藏代码
  1. [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]]]  
  2.  org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined  
  3.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)  
  4.     at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971)  
  5.     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246)  
  6.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)  
  7.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)  
  8.     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884)  
  9.     at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298)  
  10.     at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146)  
  11.     at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292)  
  12.     at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270)  
  13.     at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332)  
  14.     at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)  
  15.     at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)  
  16.     at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)  
  17.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)  
  18.     at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)  
  19.     at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)  
  20.     at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)  
  21.     at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)  
  22.     at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)  
  23.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)  
  24.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)  
  25.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
  26.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
  27.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  28.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  29.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  
  30. [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]  
  31.  org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined  
  32.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)  
  33.     at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971)  
  34.     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246)  
  35.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)  
  36.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)  
  37.     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884)  
  38.     at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298)  
  39.     at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146)  
  40.     at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292)  
  41.     at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270)  
  42.     at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332)  
  43.     at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)  
  44.     at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)  
  45.     at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)  
  46.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)  
  47.     at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)  
  48.     at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)  
  49.     at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)  
  50.     at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)  
  51.     at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)  
  52.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)  
  53.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)  
  54.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
  55.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
  56.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  57.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  58.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  

 经过断点跟踪调试:

 

org.springframework.test.context.transaction.TransactionalTestExecutionListener
Java代码   收藏代码
  1. private TransactionConfigurationAttributes retrieveTransactionConfigurationAttributes(Class<?> clazz) {  
  2.         Class<TransactionConfiguration> annotationType = TransactionConfiguration.class;  
  3.         TransactionConfiguration config = clazz.getAnnotation(annotationType);  
  4.         if (logger.isDebugEnabled()) {  
  5.             logger.debug("Retrieved @TransactionConfiguration [" + config + "] for test class [" + clazz + "]");  
  6.         }  
  7.   
  8.         String transactionManagerName;  
  9.         boolean defaultRollback;  
  10.         if (config != null) {  
  11.             transactionManagerName = config.transactionManager();  
  12.             defaultRollback = config.defaultRollback();  
  13.         }  
  14.         else {  
  15.             transactionManagerName = (String) AnnotationUtils.getDefaultValue(annotationType, "transactionManager");  
  16.             defaultRollback = (Boolean) AnnotationUtils.getDefaultValue(annotationType, "defaultRollback");  
  17.         }  
  18.   
  19.         TransactionConfigurationAttributes configAttributes =  
  20.                 new TransactionConfigurationAttributes(transactionManagerName, defaultRollback);  
  21.         if (logger.isDebugEnabled()) {  
  22.             logger.debug("Retrieved TransactionConfigurationAttributes [" + configAttributes + "] for class [" + clazz + "]");  
  23.         }  
  24.         return configAttributes;  
  25.     }  
 

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

我们可以这样做

Java代码   收藏代码
  1. @TransactionConfiguration(transactionManager="car_transactionManager")  
  2. public class BasedaoTest extends BaseTest{  
  3.   
  4. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值