DBunit、Spring TestContext实践

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

1、定义接口UserDao.java

package com.bao.dbunit.dao;

import com.bao.dbunit.entity.User;

public  interface UserDao {
   public User getUserByNick(String nick);
  
   public  void save(User user);
  
   public  void update(User user);
  
   public  void remove(String nick);
}
Pojo类: User.java
package com.bao.dbunit.entity;

public  class User {
   private String nick;
   private String password;

   public String getNick() {
     return nick;
  }

   public  void setNick(String nick) {
     this.nick = nick;
  }

   public String getPassword() {
     return password;
  }

   public  void setPassword(String password) {
     this.password = password;
  }

}
 
 
2、实现接口
1)帮助类:BaseDao.java
package com.bao.dbunit.dao.impl;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public  class BaseDao  extends JdbcDaoSupport {

}
2)实现类:DefaultUserDao.java
package com.bao.dbunit.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import com.bao.dbunit.dao.UserDao;
import com.bao.dbunit.entity.User;

public  class DefaultUserDao  extends BaseDao  implements UserDao {

   private  static String QUERY_BY_NICK =  "select * from user where user.nick = ?";
  
   private  static String REMOVE_USER =  "delete from user where user.nick = ?";
  
   private  static String INSERT_USER =  "insert into user(nick,password) values(?, ?)";
  
   private  static String UPDATE_USER =  "update user set user.password = ? where user.nick = ?";
  @Override
   public User getUserByNick(String nick) {
     return (User) getJdbcTemplate().queryForObject(QUERY_BY_NICK, new Object[]{nick},  new RowMapper(){
      @Override
       public Object mapRow(ResultSet rs,  int index)  throws SQLException {
        User user =  new User();
        user.setNick(rs.getString( "nick"));
        user.setPassword(rs.getString( "password"));
         return user;
      }
    });
  }

  @Override
   public  void remove(String nick) {
    getJdbcTemplate().update(REMOVE_USER,  new Object[]{nick});
  }

  @Override
   public  void save(User user) {
    getJdbcTemplate().update(INSERT_USER,  new Object[]{user.getNick(), user.getPassword()});
  }

  @Override
   public  void update(User user) {
    getJdbcTemplate().update(UPDATE_USER,  new Object[]{user.getPassword(), user.getNick()});
  }

}
3、相关配置:applicationContext.xml
<?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:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

  <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost/dbunit"></property>
    <property name="password" value="root" />
    <property name="username" value="root" />
  </bean>

  <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
    <property name="dataSource" ref="dataSource" />
  </bean>
  
  <bean name="baseDao" abstract="true" class="com.bao.dbunit.dao.impl.BaseDao">
    <property name="jdbcTemplate"    ref="jdbcTemplate"/>
  </bean>
  
  <bean name="userDao" parent="baseDao" class="com.bao.dbunit.dao.impl.DefaultUserDao" />
  
</beans>
sql脚本:ddl.sql
create  table  user(
  nick  varchar(12)  not  null,
  password  varchar(12)  not  null,
   primary  key(nick)
);
 
4、进行测试:UserDaoTest.java
package com.bao.dbunit.dao;

import javax.sql.DataSource;

import org.dbunit.Assertion;
import org.dbunit. database.DatabaseConnection;
import org.dbunit. database.IDatabaseConnection;
import org.dbunit. database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context. transaction.TransactionConfiguration;

import com.bao.dbunit.dao.UserDao;
import com.bao.dbunit.entity. User;


@ContextConfiguration(locations = { "classpath:testApplicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class UserDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
  @Autowired
  private UserDao userDao;

  @Autowired
  private DataSource dataSource;

  private IDatabaseConnection conn;

  @Before
   public void initDbunit() throws Exception {
    conn = new DatabaseConnection(DataSourceUtils.getConnection(dataSource));
  }

  @Test
   public void saveUser() throws Exception {
     User  user = new  User();
     user.setNick("user001");
     user.setPassword("password001");
    userDao. save( user);

    QueryDataSet actual = new QueryDataSet(conn);
    actual.addTable(" user",
        " select *  from  user  where  user.nick =  'user001'");

    IDataSet expected = new FlatXmlDataSet(new ClassPathResource(
        "com/bao/dbunit/dao/user001.xml").getFile());

    Assertion.assertEquals(expected, actual);
  }

  @Test
   public void updateUser() throws Exception {

    IDataSet origen = new FlatXmlDataSet(new ClassPathResource(
        "com/bao/dbunit/dao/user001.xml").getFile());

    DatabaseOperation. INSERT. execute(conn, origen);

     User  user = new  User();
     user.setNick("user001");
     user.setPassword("password002");
    userDao. update( user);

    QueryDataSet actual = new QueryDataSet(conn);
    actual.addTable(" user",
        " select *  from  user  where  user.nick =  'user001'");

    IDataSet expected = new FlatXmlDataSet(new ClassPathResource(
        "com/bao/dbunit/dao/user001_updated.xml").getFile());

    Assertion.assertEquals(expected, actual);
  }

  @Test
   public void removeUser() throws Exception {
    IDataSet origen = new FlatXmlDataSet(new ClassPathResource(
        "com/bao/dbunit/dao/user001.xml").getFile());
    DatabaseOperation. INSERT. execute(conn, origen);

    userDao.remove("user001");

    QueryDataSet actual = new QueryDataSet(conn);
    actual.addTable(" user", " select *  from  user  where nick =  'user001'");

    Assert.assertEquals(0, actual.getTable(" user").getRowCount());
    
  }
  
  @Test
   public void findUser() throws Exception {
    IDataSet data = new FlatXmlDataSet(new ClassPathResource(
        "com/bao/dbunit/dao/user001.xml").getFile());
    DatabaseOperation. INSERT. execute(conn, data);

    
     User  user = userDao.getUserByNick("user001");

    Assert.assertEquals("password001",  user.getPassword());
  }

}
测试相关的配置文件:
1)com.bao.dbunit.dao包下面 user001_updated.xml
<? xml  version ="1.0"  encoding ="UTF-8" ?>
< dataset >
   < user  nick ="user001"  password ="password002"  />
</ dataset >
2)com.bao.dbunit.dao包下面 user001.xml
<? xml  version ="1.0"  encoding ="UTF-8" ?>
< dataset >
   < user  nick ="user001"  password ="password001"  />
</ dataset >
 
3) testApplicationContext.xml
<? 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:tx ="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" >

   < bean  name ="dataSource"  class ="org.springframework.jdbc.datasource.DriverManagerDataSource" >
     < property  name ="driverClassName"  value ="com.mysql.jdbc.Driver" > </ property >
     < property  name ="url"  value ="jdbc:mysql://localhost/dbunit" > </ property >
     < property  name ="password"  value ="root"  />
     < property  name ="username"  value ="root"  />
   </ bean >

   < bean  name ="transactionManager"  class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
     < property  name ="dataSource"  ref ="dataSource"  />
   </ bean >
  
   < tx:annotation-driven  transaction-manager ="transactionManager" />
  
   < bean  name ="jdbcTemplate"  class ="org.springframework.jdbc.core.JdbcTemplate" > 
     < property  name ="dataSource"  ref ="dataSource"  />
   </ bean >
  
   < bean  name ="baseDao"  abstract ="true"  class ="com.bao.dbunit.dao.impl.BaseDao" >
     < property  name ="jdbcTemplate"     ref ="jdbcTemplate" />
   </ bean >
  
   < bean  name ="userDao"  parent ="baseDao"  class ="com.bao.dbunit.dao.impl.DefaultUserDao"  />
  
</ beans >
 
测试顺利通过,且数据库里面的数据进行了回滚
 
附录:pom.xml
   < dependencies >
     < dependency >
       < groupId >org.springframework </ groupId >
       < artifactId >spring </ artifactId >
       < version >2.5.6 </ version >
     </ dependency >
     < dependency >
       < groupId >mysql </ groupId >
       < artifactId >mysql-connector-java </ artifactId >
       < version >5.1.6 </ version >
     </ dependency >
     < dependency >
       < groupId >commons-logging </ groupId >
       < artifactId >commons-logging </ artifactId >
       < version >1.1.1 </ version >
     </ dependency >

     < dependency >
       < groupId >org.springframework </ groupId >
       < artifactId >spring-test </ artifactId >
       < version >2.5.6 </ version >
       < scope >test </ scope >
     </ dependency >
     < dependency >
       < groupId >junit </ groupId >
       < artifactId >junit </ artifactId >
       < version >4.4 </ version >
       < scope >test </ scope >
     </ dependency >
     < dependency >
       < groupId >org.easymock </ groupId >
       < artifactId >easymock </ artifactId >
       < version >2.4 </ version >
       < scope >test </ scope >
     </ dependency >
     < dependency >
       < groupId >org.dbunit </ groupId >
       < artifactId >dbunit </ artifactId >
       < version >2.4.6 </ version >
       < scope >test </ scope >
     </ dependency >
     < dependency >
       < groupId >org.slf4j </ groupId >
       < artifactId >slf4j-nop </ artifactId >
       < version >1.5.6 </ version >
       < scope >test </ scope >
     </ dependency >
   </ dependencies >
   < build >
     < plugins >
       < plugin >
         < artifactId >maven-compiler-plugin </ artifactId >
         < configuration >
           < target >1.6 </ target >
           < source >1.6 </ source >
           < encoding >UTF-8 </ encoding >
         </ configuration >
       </ plugin >
     </ plugins >
   </ build >
【注意】
1、保证加载的依赖的正确性,使用了外面的test-context.jar,则可能出现找不到beans配置文件的问题,而不会报找不到依赖的问题。


本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/379174,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
Java 开发者 Spring
深入理解 Spring Boot 中的 @EnableAutoConfiguration 注解:概念与实践
【4月更文挑战第21天】在 Spring Boot 项目中,@EnableAutoConfiguration 注解是实现自动配置的核心,它可以根据项目的依赖和配置,自动地配置 Spring 应用程序中的 Bean
33 3
|
20天前
|
Java API 网络架构
深入理解 Spring Boot 中的 @RestController 注解:概念与实践
【4月更文挑战第20天】在现代Web开发中,创建RESTful服务已成为常态。Spring Boot通过提供@RestController注解,极大简化了REST API的开发过程。本篇博客旨在详细介绍@RestController的概念、优势以及在Spring Boot项目中的具体应用方法。
31 8
|
2月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
3月前
|
安全 Java 数据库
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
|
4月前
|
Java 数据库连接 Spring
从零开始,探索Spring框架的魅力与实践
从零开始,探索Spring框架的魅力与实践
|
4月前
|
缓存 NoSQL Java
Spring Cache 缓存原理与 Redis 实践
Spring Cache 缓存原理与 Redis 实践
191 0
|
8月前
|
消息中间件 弹性计算 Java
Rocketmq-spring入门与实践
本场景带您体验如何在 Spring 生态中优雅地使用 Apache RocketMQ,感受最受欢迎业务开发框架与最受欢迎消息平台结合的魅力。
407 0
|
4月前
|
前端开发 安全 Java
Spring Boot项目中VO层设计:选择继承或组合的灵活实践
Spring Boot项目中VO层设计:选择继承或组合的灵活实践
132 0
|
11天前
|
消息中间件 安全 Java
探索|Spring并行初始化加速的思路和实践
作者通过看过的两篇文章发现实现Spring初始化加速的思路和方案有很多类似之处,通过本文记录一下当时的思考和实践。
|
27天前
|
监控 Java 数据库连接
Spring高手之路17——动态代理的艺术与实践
本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。讨论了动态代理的基础概念,通过实例展示了如何实现和应用这两种方法,并比较了它们的性能差异及适用场景。进一步,探讨了在动态代理中实现熔断限流和日志监控的策略,以及如何利用动态代理优化Spring应用的设计和功能。
39 6
Spring高手之路17——动态代理的艺术与实践