- 浏览: 2469504 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
说明:这里的多数据源需要利用spring中配置的多个DataSource.而且仅针对oracle数据库. 在oracle有一个schema的概念, 一个datasource下可能有多个schema, 而一个schema一般会跟一组用户名密码绑定, 这里我们采用用户名作为schema名称.
为了实现对多schema的支持, unitils提供了一个MultiSchemaXmlDataSetFactory, 也就是在采用xml的格式来实现多数据源的创建, 但不知道为什么原因, 没有提供对excel格式的多schema的支持, 而对于所有测试都采用excel来构造测试数据用户来说, 则显得有些无奈, 为了实现这个功能, 了解了一下unitils-dbunit, dbunit相关的源代码, 不过有些困难, 一个是dbunit提供的接口对我们的扩展有一些限制. 比如我们希望我们在excel中定义测试数据的时候, 每个sheet的名称将采用"datasourceName.tablename"的约定来定义. 因此我们必须在解析excel文件的时候, 必须从中已有的table中解析出datasource和tablename.
废话少说, 其具体做法是: 在从excel中取得DataSet之后(一个excel对应一个DataSet, 一个Sheet对应一个Table), 将DataSet中的所有Table根据datasource名称进行重组, 然后将得到的多个DataSet用MultiSchemaDataSet进行封装. 而MultiSchemaXlsDataSetFactory类的工作就是为了创建这个MultiSchemaDataSet.
为了对XslTable重新进行封装, 使用了下面的类来处理去掉datasource后的tablename, 因为在执行过程中ITableMetaData会使用到表名, 而这个表名我们是没办法通过继承来进行修改的, 只能通过代理的形式了.
另外目前本人使用的unitls版本为3.1, 而在其内部依赖的dbunit版本为2.2.2, 这个版本使用解析excel的poi版本在处理excel中cell的格式为日期的时候, 会有问题, 需要指定一下dbunit的最新版本2.4.6, 在maven中的依赖配置:
晕了,dbunit本来就是为了不破坏数据库现场才使用的测试工具,测试结束后就回滚了
为了实现对多schema的支持, unitils提供了一个MultiSchemaXmlDataSetFactory, 也就是在采用xml的格式来实现多数据源的创建, 但不知道为什么原因, 没有提供对excel格式的多schema的支持, 而对于所有测试都采用excel来构造测试数据用户来说, 则显得有些无奈, 为了实现这个功能, 了解了一下unitils-dbunit, dbunit相关的源代码, 不过有些困难, 一个是dbunit提供的接口对我们的扩展有一些限制. 比如我们希望我们在excel中定义测试数据的时候, 每个sheet的名称将采用"datasourceName.tablename"的约定来定义. 因此我们必须在解析excel文件的时候, 必须从中已有的table中解析出datasource和tablename.
废话少说, 其具体做法是: 在从excel中取得DataSet之后(一个excel对应一个DataSet, 一个Sheet对应一个Table), 将DataSet中的所有Table根据datasource名称进行重组, 然后将得到的多个DataSet用MultiSchemaDataSet进行封装. 而MultiSchemaXlsDataSetFactory类的工作就是为了创建这个MultiSchemaDataSet.
/** * 需要在unitils.properties文件中将<tt>DbUnitModule.DataSet.factory.default</tt>属性名设置为该类全限定名. * * @author lengda * @since 2009-12-3 下午04:15:29 */ public class MultiSchemaXlsDataSetFactory implements DataSetFactory { private static Pattern pattern = Pattern.compile("\\."); protected String defaultSchemaName; public void init(Properties configuration, String defaultSchemaName) { this.defaultSchemaName = defaultSchemaName; } public MultiSchemaDataSet createDataSet(File... dataSetFiles) { Map<String, List<ITable>> tableMap = getTables(dataSetFiles); MultiSchemaDataSet dataSets = new MultiSchemaDataSet(); for (Entry<String, List<ITable>> entry : tableMap.entrySet()) { List<ITable> tables = entry.getValue(); try { DefaultDataSet ds = new DefaultDataSet(tables.toArray(new ITable[] {})); dataSets.setDataSetForSchema(entry.getKey(), ds); } catch (AmbiguousTableNameException e) { throw new UnitilsException(String.format("使用指定表[%s]重新构造DataSet失败", tables), e); } } return dataSets; } private Map<String, List<ITable>> getTables(File... dataSetFiles) { Map<String, List<ITable>> tableMap = new HashMap<String, List<ITable>>(); // 需要根据schema把Table重新组合一下 try { for (File file : dataSetFiles) { IDataSet dataSet = new XlsDataSet(new FileInputStream(file)); String[] tableNames = dataSet.getTableNames(); for (String each : tableNames) { // 这个实际上不是schema, 是对应的spring的datasouceId String schema = null; String tableName; String[] temp = pattern.split(each); if (temp.length == 2) { schema = temp[0]; tableName = temp[1]; } else { schema = this.defaultSchemaName; tableName = each; } ITable table = dataSet.getTable(each); if (!tableMap.containsKey(schema)) { tableMap.put(schema, new ArrayList<ITable>()); } tableMap.get(schema).add(new XslTableWrapper(tableName, table)); } } } catch (Exception e) { throw new UnitilsException("Unable to create DbUnit dataset for data set files: " + Arrays.toString(dataSetFiles), e); } return tableMap; } public String getDataSetFileExtension() { return "xls"; } }
为了对XslTable重新进行封装, 使用了下面的类来处理去掉datasource后的tablename, 因为在执行过程中ITableMetaData会使用到表名, 而这个表名我们是没办法通过继承来进行修改的, 只能通过代理的形式了.
/** * 为了获得strip datasource后的表名 * * @author lengda * @since 2009-12-3 下午06:44:36 */ class XslTableWrapper extends AbstractTable { private ITable delegate; private String tableName; public XslTableWrapper(String tableName, ITable table) { this.delegate = table; this.tableName = tableName; } public int getRowCount() { return delegate.getRowCount(); } public ITableMetaData getTableMetaData() { ITableMetaData meta = delegate.getTableMetaData(); try { return new DefaultTableMetaData(tableName, meta.getColumns(), meta.getPrimaryKeys()); } catch (DataSetException e) { throw new UnitilsException("Don't get the meta info from " + meta, e); } } public Object getValue(int row, String column) throws DataSetException { Object delta = delegate.getValue(row, column); if (delta instanceof String) { if (StringUtils.isEmpty((String) delta)) { return null; } } return delta; } }
另外目前本人使用的unitls版本为3.1, 而在其内部依赖的dbunit版本为2.2.2, 这个版本使用解析excel的poi版本在处理excel中cell的格式为日期的时候, 会有问题, 需要指定一下dbunit的最新版本2.4.6, 在maven中的依赖配置:
<dependency> <groupId>org.unitils</groupId> <artifactId>unitils-dbunit</artifactId> <version>${unitils.version}</version> <exclusions> <exclusion> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.1-FINAL</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> <version>2.4.6</version> <scope>compile</scope> </dependency>
评论
3 楼
kkeli
2012-06-11
zfanxu 写道
请问,为什么我在MYSQL数据库下,运行的你的代码,程序不报错,但是数据也没插入到数据库中?
晕了,dbunit本来就是为了不破坏数据库现场才使用的测试工具,测试结束后就回滚了
2 楼
mojunbin
2012-05-10
"StringUtils"这个类是org.apache.commons.lang.StringUtils否?
1 楼
zfanxu
2012-05-03
请问,为什么我在MYSQL数据库下,运行的你的代码,程序不报错,但是数据也没插入到数据库中?
发表评论
-
Effective Unit Test:代码面前并非人人平等
2012-02-05 15:38 1702这里的观点非常值得探讨, 所有的产品代码就像是一项投资, 有些 ... -
使用Guava Supplier Mock Datetime
2012-02-04 23:35 2801通过下面的例子了解Guava Supplier的用法.在做单元 ... -
对多线程进行测试
2011-07-02 15:31 1414在junit下, 很难对多线程的代码进行测试, 因此需要借助其 ... -
补习一下EasyMock
2010-04-28 09:18 5046最近有时间, 再温习一下easymock相关的东东 http ... -
结合使用Dummy, InjectTo, PartialMock的单元测试
2009-12-24 21:21 1481结合使用Dummy, InjectTo, PartialMoc ... -
使用代码方式运行指定单元测试类及方法
2009-12-17 08:57 1768记一下, 备忘 private void runT ... -
JunitCore
2009-12-15 01:03 0JUnitCore core = new JUnitCore( ... -
修改dbunit的几个bug兼对dbunit进行扩展
2009-12-08 20:51 3194最近在对unitils进行扩展, 主要是数据库这块儿的内容, ... -
unitils中spring module初始化源码解读
2009-12-03 20:32 2655spring module的初始化还算简单, 但是熟悉里面的原 ... -
解决unitils中的dbunit使用spring中定义的多数据源
2009-12-02 20:07 3172最近在研究unitils, dbunit来适应目前的单元测试. ... -
Unitils 学习笔记
2009-11-27 19:44 7789源码部分 EasyMock相关的 有三个注解: Mock ... -
使用classloader自定义测试套件TestSuite
2009-10-21 19:04 2341junit自带了一个suite用来将多个test case放在 ... -
《单元测试之道Java版——使用JUnit》读书笔记
2009-06-09 23:06 3419这个可能是到目前为止 ... -
JunitRunner定制之模仿@Before对属性进行初始化
2009-02-12 21:54 2543在测试的过程中, 会用到一些模拟数据, 希望在每次调用测试方法 ... -
打造自己的单元测试容器——Junit Runner扩展举例
2009-02-05 23:40 6217最近对java的annotation和junit的Runner ... -
junit4源码浅析
2009-02-05 21:12 7349junit3和junit4是两个非常不同的版本, 不能简单的理 ... -
最近单元测试中写的一个Assert
2009-01-15 22:03 2917该类提供的assert方法主要针对数据库的单元测试中, 使用S ... -
用于生成mock模型对象Setter代码工具类
2009-01-12 10:35 1800最近写的一个工具类, 用来生成mock的javabean对象, ... -
EasyMock最佳实践
2008-12-20 20:43 30116推荐easymock入门贴: 窥探 ... -
JUnit 4新特性笔记
2008-12-11 08:47 2929测试任何可能的错误。 ...
相关推荐
unitils整合dbunit利用excel进行单元测试 包含mock以及整合spring进行测试
Unitils的模块化设计是其另一大特点,包括unitils-core(核心模块)、unitils-database(数据库管理)、unitils-DbUnit(DbUnit集成)、unitils-easymock(EasyMock支持)、unitils-inject(对象注入)、unitils-...
在 Unitils 中,EasyMock 提供了对方法调用的模拟,可以模拟方法的返回值、抛出异常等,从而在不依赖实际实现的情况下测试代码逻辑。这有助于编写更简洁、独立的单元测试。 4. **项目结构** - `pom.xml`: Maven 的...
Unitils 提供了一些实用的断言方法,让我们可以轻松地验证测试结果。 在上面的例子中,我们使用 assertEquals 方法来比较两个 User 对象是否相等。然而,断言失败,因为 User 类没有覆写 equals() 方法。为了避免...
Unitils 测试框架目的是让单元测试变得更加容易和可维护。Unitils 构建在DbUnit 与 EasyMock 项目之上并与JUnit 和TestNG 相结合。支持数据库测试,支持利用Mock 对象 进行测试并提供与Spring 和Hibernate 相集成。...
Unitils是一个自动化测试框架,它提供了对Spring、Hibernate等流行技术的内置支持,让开发者能够快速编写可维护的测试代码。它包含了一些模块,如数据库测试、ORM测试和依赖注入测试,旨在减少设置和清理测试环境所...
Unitils-core-3.3的jar包
在深入探讨Unitils的功能之前,让我们先理解一下单元测试和集成测试的重要性。 单元测试是软件开发中的关键环节,它允许开发者对代码的各个独立部分进行验证,确保每个模块都能正确工作。这有助于早期发现和修复...
"Unitils-3.3-with-dependencies.zip" 是一个包含Unitils 3.3版本及其所有依赖库的压缩包文件。Unitils是一个流行的Java开发框架,专注于自动化单元测试和集成测试。这个压缩包包含了运行和使用Unitils所需的所有...
让我们深入探讨一下Unitils库以及它在数据库测试中的应用。 Unitils是一个开源的Java测试框架,它提供了丰富的功能,帮助开发者简化单元测试和集成测试。在数据库测试方面,Unitils提供了自动化管理数据库和数据的...
在MyBatis中,处理多对多关系查询是一项常见的任务,尤其在数据模型设计中,很多情况下两个实体之间存在多对多的关系。本篇将详细解释如何使用MyBatis的高级映射来实现多对多查询。 首先,我们来看一个实际场景:...
Unitils框架与模块扩展Unitils这个Java开源包的目的是让单元测试变得更加容易和维护。Unitils构建在DBUnit与EasyMock项目之上并与JUnit和TestNG相结合,支持数据库测试,支持利用mock对象进行测试并提供与Spring和...
接着,使用dbunit来进行单元测试,可以使用Excel文件作为测试数据源。 六、结论 本文围绕对dbunit进行mybatis DAO层Excel单元测试,介绍了相关的知识点和实现方法。Dbunit是一个功能强大且易于使用的数据库单元...
Unitils则是一个专注于简化单元测试的Java库,它提供了诸如数据库和持久层支持等功能。Groovy是Java平台上的动态语言,与Java代码可互操作,其语法简洁,易于编写。 描述中的 "bytesize.zip" 提到了一个用于处理...
此外,Unitils还支持数据库测试,这意味着开发者可以在不依赖实际数据库环境的情况下,测试与数据库交互的代码段。它允许创建测试专用的数据库配置,执行测试中的SQL脚本,以及在测试结束时清理测试数据。这样的能力...
例如,可能需要重新定义数据源配置,以提高数据库访问的并发性能;或者调整Unitils的数据清理策略,确保测试数据的隔离性;甚至可能需要定制化DBUtils的一些操作,以满足特定的数据库交互需求。 在实际操作中,`...
它支持多种数据格式(如XML或CSV),使得测试数据的管理更加方便。通过DBUnit,开发者可以确保数据库操作不影响其他测试,提高了测试的隔离性。 **Unitils** 是一个集成了多种测试辅助功能的框架,`unitils-3.3-...
Unitils 模块 - 启动 Selenium Web 驱动程序以测试 Web 应用程序的简单方法。
8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 9.1.2 数据并发的问题 9.1.3 数据库锁机制 9.1.4 事务隔离级别 9.1.5 JDBC对事务支持 9.2 ThreadLocal...