• 测试技术
  • 博客
  • 视频
  • 开源
  • 论坛
  • 沙龙
  • 下载
  • 杂志
  • 招聘

字号: | 推荐给好友 上一篇 | 下一篇

对DAO编写单元测试

发布: 2008-6-15 14:46 | 作者: 不详 | 来源: 领测软件测试网编辑整理 | 查看: 43次 | 进入领测软件测试网论坛讨论

领测软件测试网

Uxf)s^ 软件测试技术门户(]ei*w*y8UFw5_

  注意DatabaseFixture的createProxy()方法,它将一个普通的DAO对象包装为在事务范围内执行的代理对象,即对于一个普通的DAO对象的方法调用前后,自动地开启事务并根据异常情况提交或回滚事务。软件测试技术门户0O'p v.xc4{ia

软件测试技术门户,L2U!c,AI~[+K

  下面是UserDaoImpl的单元测试类:软件测试技术门户4Rv};WH j7E

 public class UserDaoImplTest extends DatabaseFixture {
pvk,D8Aw private UserDao userDao = new UserDaoImpl();
#~'H&p?Rb private UserDao proxy = (UserDao)createProxy(userDao); @Test
+b HHt.L?M public void testQueryUser() {
P wF]+O])V&o User user = newUser("test");软件测试技术门户.oFW:oMC4u
proxy.createUser(user);软件测试技术门户A~4F5l8v(r9?
User t = proxy.queryUser("test");软件测试技术门户3B&O^p e3l!@m If
assertEquals(user.getEmail(), t.getEmail());
j%G_~!On/gI }
-} w6~*v8t.E }
软件测试技术门户,J7H*jFj CBv0hWpc"\b

  注意到UserDaoImplTest持有两个UserDao引用,userDao是普通的UserDaoImpl对象,而proxy则是将userDao进行了事务封装的对象。

2D H#X,|*E(d$Z pM

[B X4?p'g1W4C  由于UserDaoImplTest从DatabaseFixture继承,因此,@Before方法在每个@Test方法调用前自动调用,这样,每个@Test方法执行前,数据库都是一个经过初始化的“干净”的表。软件测试技术门户:{!K#U&Vo9x2^;D8K\A

软件测试技术门户 I:A3j.t \:h/F8i#@1f

  对于普通的测试,如UserDao.queryUser()方法,直接调用proxy.queryUser()即可在事务内执行查询,获得返回结果。

rnZF'jE)G@Xc 软件测试技术门户 K'I1p:W4H

  对于异常测试,例如期待一个ResourceNotFoundException,就不能直接调用proxy.queryUser()方法,否则,将得到一个UndeclaredThrowableException:

8k;^3WEI;V!U P;]

9m!n!cu,dbe  对DAO编写单元测试 图-3软件测试技术门户1A#w3KHW

tH*s(lt  这是因为通过反射调用抛出的异常被代理类包装为UndeclaredThrowableException,因此,对于异常测试,只能使用原始的userDao对象配合TransactionCallback实现:软件测试技术门户#W2At/Q/^ | e u

 @Test(expected=ResourceNotFoundException.class)
,f&vE1_ VXQ[/v public void testQueryNonExistUser() throws Exception {软件测试技术门户