快速业务通道

对J2EE中的DAO组件编写单元测试 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
lt;String> initSqls = new ArrayList<String>(); @BeforeClass // 启动HSQLDB数据库 public static void startDatabase() throws Exception { if(server!=null) return; server = new Server(); server.setDatabaseName(0, DATABASE_NAME); server.setDatabasePath(0, "mem:" + DATABASE_NAME); server.setSilent(true); server.start(); try { Class.forName("org.hsqldb.jdbcDriver"); } catch(ClassNotFoundException cnfe) { throw new RuntimeException(cnfe); } LineNumberReader reader = null; try { reader = new LineNumberReader(new InputStreamReader(DatabaseFixture.class.getClassLoader().getResourceAsStream(SCHEMA_FILE))); for(;;) { String line = reader.readLine(); if(line==null) break; // 将text类型的字段改为varchar(2000),因为HSQLDB不支持text: line = line.trim().replace(" text ", " varchar(2000) ").replace("  text,", " varchar(2000),"); if(!line.equals("")) initSqls.add(line); } } catch(IOException e) { throw new RuntimeException(e); } finally { if(reader!=null) { try { reader.close(); } catch(IOException e) {} } } } @Before // 执行初始化脚本 public void initTables() { for(String sql : initSqls) { executeSQL(sql); } } static Connection getConnection() throws SQLException { return DriverManager.getConnection("jdbc:hsqldb:mem:" + DATABASE_NAME, "sa", ""); } static void close(Statement stmt) { if(stmt!=null) { try { stmt.close(); } catch(SQLException e) {} } } static void close(Connection conn) { if(conn!=null) { try { conn.close(); } catch(SQLException e) {} } } static void executeSQL(String sql) { Connection conn = null; Statement stmt = null; try { conn = getConnection(); boolean autoCommit = conn.getAutoCommit(); conn.setAutoCommit(true); stmt = conn.createStatement(); stmt.execute(sql); conn.setAutoCommit(autoCommit); } catch(SQLException e) { log.warn("Execute failed: " + sql + "\nException: " + e.getMessage()); } finally { close(stmt); close(conn); } } public static Object createProxy(final Object target) { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable { return new TransactionCallback() { @Override protected Object doInTransaction() throws Exception { return method.invoke(target, args); } }.execute(); } } ); } }

对J2EE中的DAO组件编写单元测试(6)

时间:2011-03-06 廖雪峰

注意DatabaseFixture的createProxy()方法,它将一个普通的DAO对象包装为在事务范围内执行的代理对象,即对于一个普通的DAO对象的方法调用前后,自动地开启事务并根据异常情况提交或回滚事务。

下面是UserDaoImpl的单元测试类:

public class UserDaoImplTest extends DatabaseFixture { private UserDao userDao = new UserDaoImpl(); private UserDao proxy = (UserDao)createProxy(userDao); @Test public void testQueryUser() { User user = newUser("test"); proxy.createUser(u

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号