`
klyuan
  • 浏览: 182346 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

倒底该怎么写DAO的单元测试?

    博客分类:
  • java
阅读更多
	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,里面自动装载测试数据库。
24 楼 spiritfrog 2007-05-18  
addUserInfo之后调用getUserInfo来验证是否已经成功插入user,就算是测试方法依赖另外一个方法了吗?那么你的removeUser要是发生了异常,也同样会影响测试结果,保证测试的目的就行了吧。
如果是用的hibernate,倒是只要检查user.getId()非空就可以了。
23 楼 xly_971223 2007-05-18  
alin_ass 写道
我最近是生产用mysql,测试用hsqldb mem模式, 默认线程结束即销毁数据

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,否则你的测试太不稳定了。这异常还算好作如果有的异常是在两次插入中间产生的,你怎么用数据库来作?
19 楼 诺铁 2007-05-18  
klyuan 写道
诺铁 写道
我的做法是先测试jdbc或hibernate和数据库运行正常,然后mock之,DAO测试jdbc或hibernate方法是否被正确的调用。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。


dao与环境关联性太强了。所以还是非常有必要对dao进行集成式的测试!!
在dao进行mock不太可吧!!!失去了测试的意义!!!这样做测不出效果

那你不如改了主题吧,叫倒底该怎么写包含DAO的集成测试
我的做法是单元测试,完全可以达成单元测试的效果。
18 楼 alin_ass 2007-05-18  
我最近是生产用mysql,测试用hsqldb mem模式, 默认线程结束即销毁数据

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与环境关联性太强了。所以还是非常有必要对dao进行集成式的测试!!
在dao进行mock不太可吧!!!失去了测试的意义!!!这样做测不出效果
16 楼 klyuan 2007-05-18  
抛出异常的爱 写道
klyuan 写道
抛出异常的爱 写道
引用
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!


作一mock模型。。。如果一样的时候抛异常


在dao层作mock不太好的。因为与数据库环境的关系太大了。
如果使用mock后,反而失去了dao测试的意义!
所以说这是service的活。。。
根本轮不到dao作测试。


你的意思是dao不用测试?

如果我是用jdbc或者是ibatis实现dao.
dao是肯定需要测试的!!!

就算用hibernate来实现dao.难道就不需要测试了吗?还是需要测试的吧
15 楼 诺铁 2007-05-18  
我的做法是先测试jdbc或hibernate和数据库运行正常,然后mock之,DAO测试jdbc或hibernate方法是否被正确的调用。
有时候就手工测试,证明DAO运行正确后,更上层的东西就可以依赖与mock DAO了, 这个世界总需要些“公理”的。。。。。。
14 楼 抛出异常的爱 2007-05-18  
klyuan 写道
抛出异常的爱 写道
引用
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!


作一mock模型。。。如果一样的时候抛异常


在dao层作mock不太好的。因为与数据库环境的关系太大了。
如果使用mock后,反而失去了dao测试的意义!
所以说这是service的活。。。
根本轮不到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>
8 楼 klyuan 2007-05-17  
还是没有人响应啊,呵呵
7 楼 daquan198163 2007-05-17  
哦,这个意思阿
可以用jdbcTemplate来准备数据和验证数据库状态
6 楼 klyuan 2007-05-17  
hgq0011 写道
daquan198163 写道
在setup里面来addUserInfo,准备一条数据

BTW:spring提供一个测试基类,可以自动回滚,防止测试数据污染数据库

ROR中有不同的数据库,比如测试时用测试的数据库。
我们现在的测试也就是这样做的。


这个仍然不是最好的解决方法!!!
大家能不能把自己的测试代码都贴出来看看?

相关推荐

    SpringBoot 多模块Dao层单元测试

    IDEA Spring 多模块 Dao 层单元测试, 此代码只演示Dao层单元测试。。。。。。。。。。。。

    Android-KBUnitTest是一款轻量级DAO单元测试框架

    KBUnitTest是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。KBUnitTest支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方...

    自动测试所有dao单元测试

    NULL 博文链接:https://zhuliang1984723.iteye.com/blog/2260856

    JDBC相关单元测试及通用的Dao

    jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。

    mockito单元测试使用

    记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...

    DAO单元测试

    今天我将展示一下我是如何在实际中对dao进行单元测试的首先我们来确认一下dao需要什么样的环境,我的dao是用Spring+hibernate来构建的,而对应的数据源是oracle9。所以要进行dao的测试我需要从Spring的连接oracle的...

    对DAO编写单元测试[1]

    编写对DAO编写单元测试[1]软件测试单元测试作为保证软件质量及重构的基础,早已获得广大开发人员的认可。单元测试是一种细粒度的测试,越来越多的开发人员在提交功能模块时也同时提交相应的单元测试。对于大多数开发...

    对DAO编写单元测试源代码

    对DAO编写单元测试,其中的如下 package com.javaeedev.dao.impl; &lt;br&gt;import java.util.List; import java.util.UUID; &lt;br&gt;import com.javaeedev.dao.UserDao; import ...

    使用junit测试ssh中的dao

    NULL 博文链接:https://ruanjian-job-sina-cn.iteye.com/blog/1142032

    jmock-1.0.1-src.zip_单元测试

    都会需要对代码进行单元测试,对于关联依赖关系少或者比较简单的类来说,直接使用JUnit就可以轻松的完成测试工作,但是对于关联到其它比较复杂的类或对运行环境有要求的类的单元测试,比如ejb,servlet或Dao等,测试...

    对DAO编写单元测试[6]

    编写对DAO编写单元测试[6]下面是UserDaoImpl的单元测试类:publicclassUserDaoImplTestextendsDatabaseFixture{privateUserDaouserDao=newUserDaoImpl();privateUserDaoproxy=(UserDao)createProxy(userDao);@...

    DBUnit 进行单元测试

    一个很好的DBUnit的例子 博文链接:https://virgoooos.iteye.com/blog/186859

    数据库框架ormlite和单元测试框架junit的使用

    这是一个使用ormlite数据库框架进行数据库存储以及对数据库增删改查的操作,然后用单元测试框架junit对Dao类进行了测试的一个moudle。

    unit_test_db:DAO单元测试框架

    unit test db 这个框架仅限于数据库相关的单元测试。 功能 支持数据库datamap模式 使用 见单元测试 建数据库表结构,查看文件:prepare.sql 具体使用查看wiki:

    对DAO编写单元测试[4]

    编写对DAO编写单元测试[4]publicabstractclassTransactionCallback{publicfinalObjectexecute()throwsException{Transactiontx=HibernateUtil.getCurrentSession().beginTransaction();try{Objectr=doInTransaction...

    Android-YuiHatano——轻量级AndroidDAO单元测试框架

    YuiHatano是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。

    对DAO编写单元测试[3]

    编写对DAO编写单元测试[3]软件测试}UserDao接口定义了对用户的相关操作:publicinterfaceUserDao{UserqueryForSignOn(Stringusername);UserqueryUser(Stringusername);voidcreateUser(Useruser);voidupdateUser(User...

    对DAO编写单元测试[2]

    编写对DAO编写单元测试[2]软件测试privatelongcreatedDate;//创建时间privatelonglockDate;//锁定时间publicUser(){}publicUser(Stringusername,Stringpassword,booleanadmin,longlastSignOnDate){this.username=...

    单元测试资料

    单元测试资料,用easymock测试dao.txt

    对DAO编写单元测试[5]

    编写 对DAO编写单元测试[5] 软件测试 @Before//执行初始化脚本 publicvoidinitTables(){ for(Stringsql:initSqls){ executeSQL(sql); } } staticConnectiongetConnection()throwsSQLException{ ...

Global site tag (gtag.js) - Google Analytics