在做 Java 企业程序的时候,不可避免地要和外部资源打交道,比如数据库, Http 请求等。对于这些外部资源的处理,我们可采取的操作或者是直接处理或者是模拟处理。当我们使用 Webwork , Spring , Hibernate 等框架时,我们要测试的并不仅仅是 Java 代码,我们还要测试依赖于这些框架的配置文件等等。因此,对于数据持久化的测试, Mock 方法是行不通的,我们需要真实地测试数据库操作。对于持久化测试来说,重要的是创造出已知的“干净的”的准备数据。如果我们在测试一个持久化方法前不能确定数据库到底存着什么数据,我们只能通过反复地查看数据库数据来验证测试方法的正确性了(这就是我和大多数人以前使用的最“直接”的方法)。现在就让我们使用 DbUnit ,来更好的更自动化的测试持久化操作吧!
先介绍一下 DbUnit 。 DbUnit 是一个 JUnit 扩展,适用于数据驱动的程序。使用 DbUnit ,可以在测试运行期间将数据库的数据处于已知状态,这样在测试时可以方便地写出测试断言,也能自动地完成对数据持久化方法的测试。在使用上, DbUnit 也很简单, 它提供了大量的类对与数据库相关的操作进行了抽象和封装,大多数情况下你只需要使用少量简单的 API 。
下面我通过一个实际的小例子,介绍一下如何使用 DbUnit 。我也是刚刚使用上了 DbUnit ,经验上不是很丰富,如果文中有不对的地方,也欢迎指正。这个例子很简单,我将较为详细地说明如何使用 Hibernate 和 DbUnit 进行测试。
测试第一步,准备数据集。操作的数据表就是如下的 Account 表(使用的数据库为Mysql):
create table Account(
id bigint not null auto_increment,
name varchar ( 50 ) not null ,
primary key (id)
) character set gbk;
至于 Account 类,映射文件等这里就不给出了。AccountDAO 接口很简单,只有两个方法:
public interface AccountDAO {
void insert(Account a);
List < Account > findAll();
}
实现类如下:
public class AccountHibernateDAO implements AccountDAO{
public void insert(Account a){
Session s = HibernateSessionFactory.getSession();
s.save(a);
s.close();
}
public List < Account > findAll(){
Session s = HibernateSessionFactory.getSession();
List < Account > l = (List < Account > )s.createCriteria(Account. class ).list();
s.close();
return l;
}
}
在测试前,要准备出数据表中要装入的数据(也就是数据集),这里给出与Account表对应的数据集文件 Accout.xml 内容如下:
<? xml version='1.0' encoding='UTF-8' ?>
< dataset >
< Account id ="1" name ="kafka" />
< Account id ="2" name ="0102" />
</ dataset >
数据集就是一个 xml 文件, <dataset> 中的每个节点对应的就是一条表数据记录(一个 dataset文件可以对应多个数据表记录 )。这里的 <Account> 节点对应的就是 Account 表,属性就是表中的字段,属性值就是字段值了。在做测试时,数据集中的内容可以手动敲进去,也可以通过工具将数据库中的数据导出来。 对于数据集的详细信息,可参考 http://dbunit.sourceforge.net/components.html#FlatXmlDataSet 。
测试第二步,扩展 DBTestCase 。 DBTestCase 是继承自 JUnit 的类,扩展它需要实现 getDataSet() 来提供数据集。另外,你也可以根据需要扩展继承于 DBTestCase 的子类 JdbcBasedDBTestCase , DataSourceBasedDBTestCas , JndiBasedDBTestCase 。下面是继承于 DBTestCase 的 AccountHibernateDAO 的测试类 AccountHibernateDAOTest :
package hibernatesample.dao.impl;
import hibernatesample.domain.Account;
import hibernatesample.util.HibernateSessionFactory;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import org.dbunit.Assertion;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
public class AccountHibernateDAOTest extends DBTestCase {
private AccountHibernateDAO accountDAO;
public AccountHibernateDAOTest(){
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, HibernateSessionFactory.getDriverClass());
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, HibernateSessionFactory.getConnectionURL());
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,HibernateSessionFactory.getUsername());
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,HibernateSessionFactory.getPassword());
}
@Override
protected IDataSet getDataSet() throws Exception {
String path = " hibernatesample " + File.separator + " dao " + File.separator + " dataset " + File.separator + " Account.xml " ;
InputStream in = this .getClass().getClassLoader().getResourceAsStream(path);
return new FlatXmlDataSet(in);
}
@Override
protected DatabaseOperation getSetUpOperation() throws Exception {
return DatabaseOperation.CLEAN_INSERT;
}
@Override
protected DatabaseOperation getTearDownOperation() throws Exception {
return DatabaseOperation.NONE;
}
protected void setUp() throws Exception {
super .setUp();
accountDAO = new AccountHibernateDAO();
}
public void testInsert() {
Account a = new Account();
a.setName( " aa " );
accountDAO.insert(a);
List < Account > l = accountDAO.findAll();
assertEquals( 3 , l.size());
Account b = l.get( 2 );
assertEquals( " aa " , b.getName());
}
public void testFindAll() {
List < Account > l = accountDAO.findAll();
assertEquals( 2 , l.size());
Account a = l.get( 0 );
assertEquals( new Long( 1 ), a.getId());
assertEquals( " kafka " , a.getName());
Account b = l.get( 1 );
assertEquals( new Long( 2 ), b.getId());
assertEquals( " 0102 " , b.getName());
}
public void testDataset() throws Exception {
IDataSet databaseDataSet = getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable( " Account " );
IDataSet expectedDataSet = getDataSet();
ITable expectedTable = expectedDataSet.getTable( " Account " );
Assertion.assertEquals(expectedTable, actualTable);
}
}
上面的DBTestCase 依赖于 IDatabaseTester 接口完成工作,而 PropertiesBasedJdbcDatabaseTester 就是其使用的默认实现, AccountHibernateDAOTest 构造函数的作用是完成数据库连接参数的设置。 protected IDataSet getDataSet() 实现了装载数据集到 IDataSet 中。 getSetUpOperation 和 getTearDownOperation 是可选的方法,返回的 DatabaseOperation 为 DBTestCase 在 SetUp 和 TearDown 中将执行的操作, getSetUpOperation 默认的操作为 DatabaseOperation.CLEAN_INSERT ,也就是先清空数据表中的数据再插入数据集中的数据到数据表中。getTearDownOperation 默认的操作为 DatabaseOperation.NONE ,就是什么也不处理。可选的操作还有几个,可参考文档进行设置,但默认的设置是最通用的了。 testDataset ()只是测试数据集中的数据和装载到数据库中数据是否一致。
通过上面的设置,我们就可以测试dao方法的正确性了,而我们要做的只是准备dataset文件及使用少量的DbUnit API(可以将这些操作写到一个抽象类中,测试类都继承自这个抽象类)。
分享到:
相关推荐
数学建模拟合与插值.ppt
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
mysql相关资源.txt
此项目为一个HTML+CSS+JS的国漫分享网站,用户可以在此网站中观看自己喜欢的国漫。此网站共有4个页面,分别为首页,最新动态,热门推荐,分类。页面动漫图片齐全,内容可更改。可用于期末课程设计或个人课程设计。
Python爬虫爬取漫画
模拟退火算法应用。C++语言编程用模拟退火算法解决旅行商问题。该资源包含模拟退火算法C++语言的源代码。模拟退火算法是一种基于概率的全局优化算法,最初来自于物理学中的退火过程。它通过模拟金属冷却时原子排列逐渐趋于最低能量状态的过程来寻找问题的最优解。模拟退火算法常用于解决非线性、组合优化问题,特别适合于大规模、复杂的搜索空间。
传感器试题及答案.doc
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
本文档主要讲述的是MongoDB数据表基本操作;希望对大家会有帮助;感兴趣的朋友可以过来看看
本数据集提供了2011至2021年间全国各省废气和废水中主要污染物的排放量统计数据。数据涵盖了二氧化硫、氮氧化物、烟尘和颗粒物等关键污染物的排放量,为研究中国环境状况和污染物排放趋势提供了宝贵信息。数据显示,2011-2021年间,各省的二氧化硫排放量从数十万吨到数百万吨不等,其中广东、广西、海南等省份的排放量较高。氮氧化物排放量同样显示出地域差异,北京、天津等北方城市的排放量相对较低,而一些工业大省如河北、山西的排放量较高。颗粒物排放量统计显示,工业源和生活源是主要的排放源,其中工业源排放量占比较大。这些数据不仅对环保政策制定者具有参考价值,也为学术研究提供了实证基础。
脉冲宽度测量单片机课程设计.doc
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
全国矢量地图数据【国道+高速公路】ArcGIS Shape格式数据集是一种专门用于地理信息系统(GIS)的矢量数据集,包含中国范围内国道和高速公路的详细路网信息。该数据集广泛应用于交通规划、导航、物流分析和灾害应急等领域,具有高精度和易用性。 数据集特点: 1. 数据内容: 国道:包括以“G”开头的国家级公路,如G1京哈高速、G107国道等。 高速公路:包括全国范围内的所有高速公路网,覆盖主要经济区、城市和边境口岸。 属性数据: 道路编号(国道或高速公路编号)。 道路名称。 道路等级(如一级、二级、快速路等)。 起点和终点坐标。 道路长度(单位:公里)。 相关属性(如路段建成年份、设计速度、车道数等)。 2. 数据格式: **Shapefile(.shp)**格式,支持主流GIS软件(如ArcGIS、QGIS)及数据处理工具(如Python、Matlab)。 3. 投影坐标系: 一般采用WGS84地理坐标系,或可根据需求转换为**GCJ-02(火星坐标系)**以配合国内导航应用。
4
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 感兴趣的朋友可以过来看看
商道融绿ESG评级季度数据及分项ESG评级2015-2022年的数据集提供了一个全面评估上市公司在环境、社会和公司治理(ESG)方面表现的视角。该数据集覆盖了2015至2022年间的数据,包含了沪深A股上市公司以及港股通的香港上市公司。数据集包含了多个维度的指标,如公司代码、公司名称、评级日期、ESG综合评级、历史评级、财务状况和所属行业等,共计13个指标。这些指标不仅包括了ESG评级,还涵盖了公司的财务分析,例如总市值、流通市值、市盈率PE(TTM)、每股收益EPS(TTM)、每股营业收入(TTM)以及每股经营活动产生的现金流量净额(TTM)等。此外,数据集还提供了证监会行业和Wind行业的分类信息,为研究者提供了一个多角度分析上市公司ESG表现的工具。该数据集对于投资者、资产管理公司以及企业自身在可持续发展报告撰写和风险管理中具有重要参考价值。
WPF树菜单拖拽功能,下级目录拖到上级目录,上级目录拖到下级目录.zip