zoukankan      html  css  js  c++  java
  • spring下Junit_jdbc回滚demo

    配置测试类
      添加如下内容在class前,用于配置applicationContext.xml文件的位置。
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext.xml")

    ***********************
    Junit4 不回滚
    2012-02-13
     @Rollback
    表明被注解方法的事务在完成后是否需要被回滚。 如果true,事务将被回滚,否则事务将被提交。使用@Rollback接口来在类级别覆写配置的默认回滚标志。
    @Rollback(false)
    public void testProcessWithoutRollback() {
    // …
    }
    @NotTransactional
    出现该注解表明测试方法必须不在事务中执行。
    @NotTransactional
    public void testProcessWithoutTransaction() {
    // …
    }

    *************************************************************
    2008-11-24 
    在一般的java 项目中,我们对于数据库的操作需要写大量的junit代码,这些测试代码都包含事物。
        在以下情况下:使用插入了一条数据到test database ,每跑一次junit test 都会向test database 里面插入相同的数据。这明显不可取,如果自己写rollback,代码量很大。
    那有没有方法实现junit test的回滚,可以使用spring自带的事物管理来解决。
    以下为步骤:
    1:配置DataSourceTransactionManager
     <!-- config transaction -->
         <bean id="txManager"
             class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
             <property name="dataSource" ref="dataSource" />
         </bean>

    dataSource为数据库配置:(这里使用了变量配置数据库的用户名和密码)
     <bean id="dataSource"
             class="org.apache.commons.dbcp.BasicDataSource"
             destroy-method="close">
             <property name="url" value="${jdbc.url}" />
             <property name="username" value="${jdbc.username}" />
             <property name="password" value="${jdbc.password}" />
             <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />         
     </bean>

    解析来读取配置文件的配置(注意value里面的路径可以使相对和绝对路径)
      <!--  Reading configuration file -->
         <bean id="propertyConfigurer"
             class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
             <property name="locations">
                 <list>
                     <value>classpath*:resources/jdbc.properties</value>
                 </list>
             </property>
         </bean>
    jdbc.properties 的配置如下:
    jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
     jdbc.url=jdbc:oracle:thin:@0.0.0.0:1521:orcl
     jdbc.username=userName
     jdbc.password=password
     jdbc.testOnBorrow=true

    以上是spring 数据源的配置。
    2:junit class 写法 TestClass.java
    /**固定写法 */ 
    @RunWith(SpringJUnit4ClassRunner.class)
     /**txManage是配置的事物管理Object  defaultRollback = true 任何情况都回滚*/
    @TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
     /**读取配置文件到运行环境。注意:file的路径 */
    @ContextConfiguration(locations = { "file:web/WEB-INF/applicationContext*.xml" })
     @Transactional
     public abstract class TestPersonService {
         /**声明环境里面的bean */            
        @Autowired
        private PersonService personService; 

        @Test
         public void testGetPerson(){
             int userId = 1;
            Person person= personService.getPerson(userId );
             assertNotNull(person);
             assertEquals(userId,person.getUserId());
        }  

    }
    使用了设置断点的junit写法。下面为非回滚junit class类写法。
    private PersonService personService= (PersonService ) OfferMeAppContext.getContext().getBean(
                    "personService");

         @Before
         public void setUp() {
             ApplicationContext context = new FileSystemXmlApplicationContext(./web/WEB-INF/applicationContext*.xml)  ;
            this.personService= (PersonService ) context .getContext().getBean(
                    "personService");
             dataSource = (DataSource) context .getContext().getBean(
                     "dataSource");
             this.jdbcTemplate = new JdbcTemplate(dataSource);
         }


         
         //@Test
        @Test
        public void testGetPerson(){
            int userId = 1;
            Person person= personService.getPerson(userId );
            assertNotNull(person);
       }
    注意:
    1:关于配置文件的路径一定要正确
    2:spring 配置的object 名字和java类里面写的该类对象的属性名一定要一致
    3:spring 的ApplicationContext实现类必须使用ClassPathXmlApplicationContext而不能使用ClassPathResource
    ApplicationContext f = new ClassPathXmlApplicationContext("applicationContext.xml");

  • 相关阅读:
    【转】使用外部看门狗请三思!
    【转】一招解决MCU启动异常
    【转】电源芯片选型,容易忽略的“QC”
    【转】为什么 MQTT 是最适合物联网的网络协议
    【转】中国芯酸往事
    函数输入参数类型为枚举时,则限定函数参数的接收范围,非枚举值输入则错误
    函数形参为指针与非指针的区别
    【转】函数中的形参问题(指针形参、引用形参、二重指针作为形参)
    【转】Example of using the --info linker option
    【转】STM32
  • 原文地址:https://www.cnblogs.com/huapox/p/3516396.html
Copyright © 2011-2022 走看看