- 浏览: 185646 次
- 性别:
- 来自: 深圳
-
最新评论
-
mengfei86:
你们讨论的时候我刚上大学,。。。。、、现在都过去好多年了,。 ...
J2EE项目异常处理 -
di1984HIT:
文章不错,学习了
Ibatis读写CLOB数据 -
wulixiaodao:
main{
metodA();
}
详解spring事务属性 -
wulixiaodao:
Main{
Connection con=null;
...
详解spring事务属性 -
tao_gun:
感谢,有点懂了
详解spring事务属性
public void testAddUserInfo() throws Exception{ userInfo = new UserInfoDTO(); userInfo.setUserId("001"); userInfo.setUserName("张三"); userInfoDao.addUserInfo(userInfo); this.assertNotNull(userInfoDao.getUserInfo(userInfo.getUserId())); this.assertEquals(userInfo.getUserId(), userInfoDao.getUserInfo(userInfo.getUserId()).getUserId()); userInfoDao.removeUser(userInfo.getUserId()); }
为了避免脏数据!!!所以要把新插入的数据用removeUser删除掉!!!
当然,如果使用Spring的那个带有事务的基类。在TearDown时,会回滚所有事务。removeUser这个方法可以无需要。不会产生因单元测试的脏数据
困惑多一:
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
根据单元测试的原则!!!
1.测试方法不应该有先后顺序!!
2.测试方法不应该依赖于另一个方法!
你上面的例子,我们需要测试的仅仅是addUserInfo这个方法!!
假设addUserInfo方法实际上是没有任何问题的,如果getUserInfo方法不正常。的确影响了这个测试结果!!!
大家平时是怎么写dao测试方法的?
评论
25 楼
刑天战士
2007-05-18
有种东西叫做dbunit……
用dbunit,会在开始的时候准备好数据,再tearDown的时候默认的是删除。上面的GG也提到过,对于测试,也可以仿照RoR的做法,做一个测试用数据库,写一个测试的继承自TestCase,里面自动装载测试数据库。
用dbunit,会在开始的时候准备好数据,再tearDown的时候默认的是删除。上面的GG也提到过,对于测试,也可以仿照RoR的做法,做一个测试用数据库,写一个测试的继承自TestCase,里面自动装载测试数据库。
24 楼
spiritfrog
2007-05-18
addUserInfo之后调用getUserInfo来验证是否已经成功插入user,就算是测试方法依赖另外一个方法了吗?那么你的removeUser要是发生了异常,也同样会影响测试结果,保证测试的目的就行了吧。
如果是用的hibernate,倒是只要检查user.getId()非空就可以了。
如果是用的hibernate,倒是只要检查user.getId()非空就可以了。
23 楼
xly_971223
2007-05-18
alin_ass 写道
我最近是生产用mysql,测试用hsqldb mem模式, 默认线程结束即销毁数据
e.g
e.g
/** * @version 2007-5-9 * @author xalinx at gmail dot com * */ public class DalTestSupport extends TestSupport { @Before public void before() { dropAndCreateDb(); } @After public void after() { destoryConnection(); } private DataSource db1 = null; private Connection conn = null; private Statement stmt = null; private void dropAndCreateDb() { try { init(); drop(); createTables(); insertData(); } catch (Throwable e) { e.printStackTrace(); } } private void destoryConnection() { DbUtils.closeQuietly(conn, stmt); } private void init() throws SQLException { db1 = (DataSource) getBean("DB1"); conn = db1.getConnection(); stmt = conn.createStatement(); } protected User user1, user2; protected Group group1, group2; protected int userCount; protected int groupCount; private void insertData() throws SQLException { // insert group data String sql = "INSERT INTO USERGROUP(ID, NAME, MEMBERCOUNT) VALUES (1112, 'photo', 200);"; stmt.executeUpdate(sql); sql = "INSERT INTO USERGROUP(ID, NAME, MEMBERCOUNT) VALUES (1113, 'java', 100);"; stmt.executeUpdate(sql); group1 = new GroupImpl(); group1.setId(1112); group1.setName("photo"); group1.setMemberCount(200); group2 = new GroupImpl(); group2.setId(1113); group2.setName("java"); group2.setMemberCount(100); // insert user data sql = "INSERT INTO USER(ID, USERNAME, PASSWORD, NICKNAME, CITY, PROV, USERSTATUS, CREATETIME, MODIFYTIME) " + "VALUES (1001, 'xalinx@gmail.com', '888', 'nio', 'taizhou', 'zhejiang', 0, '2007-05-02 18:15:16', '2007-05-10 19:01:16');"; stmt.executeUpdate(sql); sql = "INSERT INTO USER(ID, USERNAME, PASSWORD, NICKNAME, CITY, PROV, USERSTATUS, CREATETIME, MODIFYTIME) " + "VALUES (1002, 'hsfaye@gmail.com', '888', 'faye', 'quzhou', 'zhejiang', 0, '2007-05-02 18:15:16', '2007-05-10 19:01:16');"; stmt.executeUpdate(sql); user1 = new UserImpl(); user1.setId(1001); user1.setUsername("xalinx@gmail.com"); user1.setPassword("888"); user1.setNickname("nio"); user1.setCity("taizhou"); user1.setProv("zhejiang"); Date createTime = new GregorianCalendar(2007, 4, 2, 18, 15, 16).getTime(); Date modifyTime = new GregorianCalendar(2007, 4, 10, 19, 1, 16).getTime(); user1.setCreateTime(createTime); user1.setModifyTime(modifyTime); user2 = new UserImpl(); user2.setId(1001); user2.setUsername("xalinx@gmail.com"); user2.setPassword("888"); user2.setNickname("nio"); user2.setCity("taizhou"); user2.setProv("zhejiang"); user2.setCreateTime(createTime); user2.setModifyTime(modifyTime); userCount = 2; groupCount = 2; } private void createTables() throws SQLException { String sql = "CREATE TABLE USERGROUP(ID BIGINT, NAME VARCHAR(254), MEMBERCOUNT INTEGER," + " CONSTRAINT PK_USERGROUP_ID PRIMARY KEY (ID), CONSTRAINT UK_USERGROUP_NAME UNIQUE (NAME));"; stmt.executeUpdate(sql); sql = "CREATE TABLE USER(ID BIGINT, USERNAME VARCHAR(254), PASSWORD VARCHAR(32), NICKNAME VARCHAR(32)," + " CITY VARCHAR(32), PROV VARCHAR(32), USERSTATUS BIGINT, CREATETIME DATETIME, MODIFYTIME DATETIME," + " CONSTRAINT PK_USER_ID PRIMARY KEY (ID), CONSTRAINT UK_USER_USERNAME UNIQUE (USERNAME)," + " CONSTRAINT UK_USER_NICKNAME UNIQUE (NICKNAME));"; stmt.executeUpdate(sql); } private void drop() throws SQLException { String sql = "DROP TABLE USERGROUP IF EXISTS"; stmt.executeUpdate(sql); sql = "DROP TABLE USER IF EXISTS"; stmt.executeUpdate(sql); user1 = null; user2 = null; userCount = 0; groupCount = 0; } }
/** * @author alin [xalinx at gmail dot com] * @date 2007-5-7 */ public class UserDaoImplTest extends DalTestSupport { private UserDao userDao = (UserDaoImpl) getBean("userDao"); /** * Test method for {@link com.tworole.dal.dao.jdbc.UserDaoImpl#findCount()}. */ @Test public void findCount() { assertEquals(userCount, userDao.findCount()); } /** * Test method for * {@link com.tworole.dal.dao.jdbc.UserDaoImpl#findById(Long)}. */ @Test public void findById() { User u = userDao.findById(-1l); assertNull(u); u = userDao.findById(user1.getId()); assertEquals(u, user1); } /** * Test method for * {@link com.tworole.dal.dao.jdbc.UserDaoImpl#updateById(org.nanhill.commons.dbutil.builder.BeanMonitor)}. */ @Test public void testUpdateById() { String newNickName = "" + System.currentTimeMillis(); BeanMonitor<User> monitor = new BeanMonitor<User>(); User proxy = monitor.proxy(user1); proxy.setNickname(newNickName); userDao.updateById(monitor); User fetch = userDao.findById(user1.getId()); assertEquals(fetch.getNickname(), newNickName); } /** * Test method for * {@link com.tworole.dal.dao.jdbc.UserDaoImpl#deleteById(Long)}. */ @Test public void deleteById() { userDao.deleteById(user1.getId()); User u = userDao.findById(user1.getId()); assertNull(u); } }
这测试也太复杂了吧 连创建表都测试
22 楼
xly_971223
2007-05-18
困惑多一: 新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
UserDao.createUser(user); assertNotNull(user.getId());
这样就行了 为什么要用getUserInfo()
21 楼
dengyin2000
2007-05-18
结合dbunit 和 spring的那个测试基类。 dbunit为你准备好数据。 数据是定义在xml文件中的
20 楼
抛出异常的爱
2007-05-18
dao只测CRUD
如果有逻辑就在service中用mock来作DAO,否则你的测试太不稳定了。这异常还算好作如果有的异常是在两次插入中间产生的,你怎么用数据库来作?
如果有逻辑就在service中用mock来作DAO,否则你的测试太不稳定了。这异常还算好作如果有的异常是在两次插入中间产生的,你怎么用数据库来作?
19 楼
诺铁
2007-05-18
klyuan 写道
诺铁 写道
我的做法是先测试jdbc或hibernate和数据库运行正常,然后mock之,DAO测试jdbc或hibernate方法是否被正确的调用。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。
dao与环境关联性太强了。所以还是非常有必要对dao进行集成式的测试!!
在dao进行mock不太可吧!!!失去了测试的意义!!!这样做测不出效果
那你不如改了主题吧,叫倒底该怎么写包含DAO的集成测试?
我的做法是单元测试,完全可以达成单元测试的效果。
18 楼
alin_ass
2007-05-18
我最近是生产用mysql,测试用hsqldb mem模式, 默认线程结束即销毁数据
e.g
e.g
/** * @version 2007-5-9 * @author xalinx at gmail dot com * */ public class DalTestSupport extends TestSupport { @Before public void before() { dropAndCreateDb(); } @After public void after() { destoryConnection(); } private DataSource db1 = null; private Connection conn = null; private Statement stmt = null; private void dropAndCreateDb() { try { init(); drop(); createTables(); insertData(); } catch (Throwable e) { e.printStackTrace(); } } private void destoryConnection() { DbUtils.closeQuietly(conn, stmt); } private void init() throws SQLException { db1 = (DataSource) getBean("DB1"); conn = db1.getConnection(); stmt = conn.createStatement(); } protected User user1, user2; protected Group group1, group2; protected int userCount; protected int groupCount; private void insertData() throws SQLException { // insert group data String sql = "INSERT INTO USERGROUP(ID, NAME, MEMBERCOUNT) VALUES (1112, 'photo', 200);"; stmt.executeUpdate(sql); sql = "INSERT INTO USERGROUP(ID, NAME, MEMBERCOUNT) VALUES (1113, 'java', 100);"; stmt.executeUpdate(sql); group1 = new GroupImpl(); group1.setId(1112); group1.setName("photo"); group1.setMemberCount(200); group2 = new GroupImpl(); group2.setId(1113); group2.setName("java"); group2.setMemberCount(100); // insert user data sql = "INSERT INTO USER(ID, USERNAME, PASSWORD, NICKNAME, CITY, PROV, USERSTATUS, CREATETIME, MODIFYTIME) " + "VALUES (1001, 'xalinx@gmail.com', '888', 'nio', 'taizhou', 'zhejiang', 0, '2007-05-02 18:15:16', '2007-05-10 19:01:16');"; stmt.executeUpdate(sql); sql = "INSERT INTO USER(ID, USERNAME, PASSWORD, NICKNAME, CITY, PROV, USERSTATUS, CREATETIME, MODIFYTIME) " + "VALUES (1002, 'hsfaye@gmail.com', '888', 'faye', 'quzhou', 'zhejiang', 0, '2007-05-02 18:15:16', '2007-05-10 19:01:16');"; stmt.executeUpdate(sql); user1 = new UserImpl(); user1.setId(1001); user1.setUsername("xalinx@gmail.com"); user1.setPassword("888"); user1.setNickname("nio"); user1.setCity("taizhou"); user1.setProv("zhejiang"); Date createTime = new GregorianCalendar(2007, 4, 2, 18, 15, 16).getTime(); Date modifyTime = new GregorianCalendar(2007, 4, 10, 19, 1, 16).getTime(); user1.setCreateTime(createTime); user1.setModifyTime(modifyTime); user2 = new UserImpl(); user2.setId(1001); user2.setUsername("xalinx@gmail.com"); user2.setPassword("888"); user2.setNickname("nio"); user2.setCity("taizhou"); user2.setProv("zhejiang"); user2.setCreateTime(createTime); user2.setModifyTime(modifyTime); userCount = 2; groupCount = 2; } private void createTables() throws SQLException { String sql = "CREATE TABLE USERGROUP(ID BIGINT, NAME VARCHAR(254), MEMBERCOUNT INTEGER," + " CONSTRAINT PK_USERGROUP_ID PRIMARY KEY (ID), CONSTRAINT UK_USERGROUP_NAME UNIQUE (NAME));"; stmt.executeUpdate(sql); sql = "CREATE TABLE USER(ID BIGINT, USERNAME VARCHAR(254), PASSWORD VARCHAR(32), NICKNAME VARCHAR(32)," + " CITY VARCHAR(32), PROV VARCHAR(32), USERSTATUS BIGINT, CREATETIME DATETIME, MODIFYTIME DATETIME," + " CONSTRAINT PK_USER_ID PRIMARY KEY (ID), CONSTRAINT UK_USER_USERNAME UNIQUE (USERNAME)," + " CONSTRAINT UK_USER_NICKNAME UNIQUE (NICKNAME));"; stmt.executeUpdate(sql); } private void drop() throws SQLException { String sql = "DROP TABLE USERGROUP IF EXISTS"; stmt.executeUpdate(sql); sql = "DROP TABLE USER IF EXISTS"; stmt.executeUpdate(sql); user1 = null; user2 = null; userCount = 0; groupCount = 0; } }
/** * @author alin [xalinx at gmail dot com] * @date 2007-5-7 */ public class UserDaoImplTest extends DalTestSupport { private UserDao userDao = (UserDaoImpl) getBean("userDao"); /** * Test method for {@link com.tworole.dal.dao.jdbc.UserDaoImpl#findCount()}. */ @Test public void findCount() { assertEquals(userCount, userDao.findCount()); } /** * Test method for * {@link com.tworole.dal.dao.jdbc.UserDaoImpl#findById(Long)}. */ @Test public void findById() { User u = userDao.findById(-1l); assertNull(u); u = userDao.findById(user1.getId()); assertEquals(u, user1); } /** * Test method for * {@link com.tworole.dal.dao.jdbc.UserDaoImpl#updateById(org.nanhill.commons.dbutil.builder.BeanMonitor)}. */ @Test public void testUpdateById() { String newNickName = "" + System.currentTimeMillis(); BeanMonitor<User> monitor = new BeanMonitor<User>(); User proxy = monitor.proxy(user1); proxy.setNickname(newNickName); userDao.updateById(monitor); User fetch = userDao.findById(user1.getId()); assertEquals(fetch.getNickname(), newNickName); } /** * Test method for * {@link com.tworole.dal.dao.jdbc.UserDaoImpl#deleteById(Long)}. */ @Test public void deleteById() { userDao.deleteById(user1.getId()); User u = userDao.findById(user1.getId()); assertNull(u); } }
17 楼
klyuan
2007-05-18
诺铁 写道
我的做法是先测试jdbc或hibernate和数据库运行正常,然后mock之,DAO测试jdbc或hibernate方法是否被正确的调用。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。
dao与环境关联性太强了。所以还是非常有必要对dao进行集成式的测试!!
在dao进行mock不太可吧!!!失去了测试的意义!!!这样做测不出效果
16 楼
klyuan
2007-05-18
抛出异常的爱 写道
klyuan 写道
抛出异常的爱 写道
引用
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
作一mock模型。。。如果一样的时候抛异常
在dao层作mock不太好的。因为与数据库环境的关系太大了。
如果使用mock后,反而失去了dao测试的意义!
根本轮不到dao作测试。
你的意思是dao不用测试?
如果我是用jdbc或者是ibatis实现dao.
dao是肯定需要测试的!!!
就算用hibernate来实现dao.难道就不需要测试了吗?还是需要测试的吧
15 楼
诺铁
2007-05-18
我的做法是先测试jdbc或hibernate和数据库运行正常,然后mock之,DAO测试jdbc或hibernate方法是否被正确的调用。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。
14 楼
抛出异常的爱
2007-05-18
klyuan 写道
抛出异常的爱 写道
引用
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
作一mock模型。。。如果一样的时候抛异常
在dao层作mock不太好的。因为与数据库环境的关系太大了。
如果使用mock后,反而失去了dao测试的意义!
根本轮不到dao作测试。
13 楼
klyuan
2007-05-17
抛出异常的爱 写道
引用
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
作一mock模型。。。如果一样的时候抛异常
在dao层作mock不太好的。因为与数据库环境的关系太大了。
如果使用mock后,反而失去了dao测试的意义!
12 楼
抛出异常的爱
2007-05-17
引用
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
作一mock模型。。。如果一样的时候抛异常
11 楼
klyuan
2007-05-17
其它人是怎么写的呢?
10 楼
klyuan
2007-05-17
这也是一个不错的方法!!!
9 楼
daquan198163
2007-05-17
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j' start='1'>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> XxxServiceTest </span><span class='keyword'>extends</span><span> AbstractTransactionalDataSourceSpringContextTests { </span></span></li>
</ol>
</div>
<br/>
<br/>
准备数据:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
super.jdbcTemplate.execute("INSERT INTO GA_DEPARTMENT (fullName, shortName, status, id) " + "VALUES ('testDepart', 'testDepart', '4', '88888')");<br/>
</div>
测试:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<ol class='dp-j' start='1'>
<li class='alt'><span><span>Assert.assertEquals(................. </span></span></li>
</ol>
</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j' start='1'>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> XxxServiceTest </span><span class='keyword'>extends</span><span> AbstractTransactionalDataSourceSpringContextTests { </span></span></li>
</ol>
</div>
<br/>
<br/>
准备数据:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
super.jdbcTemplate.execute("INSERT INTO GA_DEPARTMENT (fullName, shortName, status, id) " + "VALUES ('testDepart', 'testDepart', '4', '88888')");<br/>
</div>
测试:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<ol class='dp-j' start='1'>
<li class='alt'><span><span>Assert.assertEquals(................. </span></span></li>
</ol>
</div>
8 楼
klyuan
2007-05-17
还是没有人响应啊,呵呵
7 楼
daquan198163
2007-05-17
哦,这个意思阿
可以用jdbcTemplate来准备数据和验证数据库状态
可以用jdbcTemplate来准备数据和验证数据库状态
6 楼
klyuan
2007-05-17
hgq0011 写道
daquan198163 写道
在setup里面来addUserInfo,准备一条数据
BTW:spring提供一个测试基类,可以自动回滚,防止测试数据污染数据库
BTW:spring提供一个测试基类,可以自动回滚,防止测试数据污染数据库
ROR中有不同的数据库,比如测试时用测试的数据库。
我们现在的测试也就是这样做的。
这个仍然不是最好的解决方法!!!
大家能不能把自己的测试代码都贴出来看看?
发表评论
-
一个特殊的异常处理
2008-12-13 23:59 1417一个特殊的异常处理 文:袁光东 一、业务需求说明 前段时间接 ... -
程序员为什么不写单元测试
2007-07-04 11:31 29323程序员为什么不写单 ... -
Spring JavaConfig开发指南(下)
2007-06-03 10:56 6588... -
Spring JavaConfig开发指南(上)
2007-06-03 10:25 7836Spring JavaConfig开发指南 作者:袁光东 1. ... -
ThreadLocal与synchronized
2007-05-22 17:49 27537ThreadLocal与synchronized Java良好 ... -
详解spring事务属性
2007-05-10 22:55 20530Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我 ... -
Ibatis读写CLOB数据
2007-04-25 16:43 23064Ibatis是一个高效,方便,易于学习的数据访问组件,在性能上 ... -
细说框架风云 JSF能否拯救WEB江湖
2007-04-24 18:08 2114细说框架风云 JSF能否拯救WEB江湖 Java ... -
模板方法模式实现探讨
2007-04-23 18:30 4455模板方法(Template Method) ... -
Spring架构设计-增强MultiActionController
2007-04-20 12:04 4864Spring架构设计-增强MultiActionControl ... -
让Spring架构减化事务配置
2007-04-19 12:20 4719让Spring架构减化事务配置 注:原创文章,本文曾发表于it ... -
J2EE项目异常处理
2007-04-18 12:19 16478J2EE项目异常处理 ...
相关推荐
本篇文章将重点讲解如何在IDEA环境下,针对Spring多模块项目中的Dao层进行单元测试。 首先,我们要理解什么是单元测试。单元测试是一种软件测试方法,它针对程序中的最小可测试单元,如方法或类,进行独立验证。在...
KBUnitTest是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。KBUnitTest支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方...
NULL 博文链接:https://zhuliang1984723.iteye.com/blog/2260856
jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。
标题“使用junit测试ssh中的dao”涉及到的是Java开发中的单元测试技术,特别是针对SSH(Struts2、Spring、Hibernate)框架中的数据访问对象(DAO)进行测试。SSH是Java Web开发中常用的三大开源框架,它们协同工作以...
**为什么要进行单元测试?** 1. **编译正确不等于运行正确**:编译阶段的错误并不总能在编译时被发现,需要运行时才能暴露。 2. **修改代码可能导致错误**:添加新功能或修改现有代码可能会引入新的bug。 3. **集成...
今天我将展示一下我是如何在实际中对dao进行单元测试的首先我们来确认一下dao需要什么样的环境,我的dao是用Spring+hibernate来构建的,而对应的数据源是oracle9。所以要进行dao的测试我需要从Spring的连接oracle的...
编写对DAO编写单元测试[1]软件测试单元测试作为保证软件质量及重构的基础,早已获得广大开发人员的认可。单元测试是一种细粒度的测试,越来越多的开发人员在提交功能模块时也同时提交相应的单元测试。对于大多数开发...
传统的单元测试通常不涉及外部资源,但当测试的对象直接与数据库交互时(例如DAO层),就需要确保数据库处于一个已知且可预测的状态。DBunit允许开发者在测试前将数据库的状态设定为一个特定的状态,并在测试结束后...
记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...
Struts2+Spring+Hibernate 中的Action单元测试环境搭建 在软件开发中,单元测试是一种非常重要的测试方法,可以帮助我们确保代码的可靠性和稳定性。在 Struts2+Spring+Hibernate 框架中,对 Action 的单元测试环境...
这个压缩包中的内容主要涉及SSH框架下进行单元测试的代码示例。通过`JdbcHibernateSupport.java`和`UnitTestTools.java`这两个文件,我们可以深入理解如何在SSH环境中编写和使用单元测试。 首先,`...
DBUnit 是一个强大的Java库,专门用于数据库的单元测试。它与JUnit紧密集成,使得开发者能够在执行单元测试时,能够方便地控制和验证数据库的状态。DBUnit 的核心理念是通过导入和导出数据来帮助测试数据库驱动的...
在IT行业中,Hibernate是一个强大的Java持久化框架,它简化了与关系型数据库的交互,而单元测试则是确保代码质量的重要工具。在这个“hibernate 单元测试批处理代码”项目中,我们将深入探讨如何使用Hibernate进行...
在软件开发过程中,单元测试是确保代码质量的重要环节。`JUnit` 是Java编程语言中最流行的单元测试框架,它允许开发者编写可重复运行的测试用例,以验证代码的正确性。`Spring` 和 `Hibernate` 分别是Java企业级应用...
在Spring框架中,进行Dao层的集成单元测试时,常常会结合Dbunit工具来实现数据库相关的测试。Dbunit是一款强大的Java库,它扩展了JUnit,为数据库提供了结构化数据的导入和导出,使得测试更加方便和可靠。下面将详细...
在Struts+Spring框架下进行单元测试,主要涉及到对Action、Service以及DAO层的测试。 ### 测试Action类 在Struts框架中,Action类扮演着处理用户请求的核心角色。对于Action类的单元测试,重点在于验证Action的...
在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的正确性和可靠性。Spring Boot提供了方便的工具和库,使得编写和执行单元测试变得简单高效。本章节我们将深入探讨Spring Boot中的...
在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...
对DAO编写单元测试,其中的如下 package com.javaeedev.dao.impl; <br>import java.util.List; import java.util.UUID; <br>import com.javaeedev.dao.UserDao; import ...