亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
對DAO編寫單元測試
作者:網絡轉載 發布時間:[ 2013/2/19 15:12:51 ] 推薦標簽:

  下面,我們開始對DAO組件編寫單元測試。前面提到了HSQLDB這一小巧的純Java數據庫。HSQLDB除了提供完整的JDBC驅動以及事務支持外,HSQLDB還提供了進程外模式(與普通數據庫類似)和進程內模式(In-Process),以及文件和內存兩種存儲模式。我們將HSQLDB設定為進程內模式及僅使用內存存儲,這樣,在運行JUnit測試時,可以直接在測試代碼中啟動HSQLDB。測試完畢后,由于測試數據并沒有保存在文件上,因此,不必清理數據庫。

  此外,為了執行批量測試,在每個獨立的DAO單元測試運行前,我們都執行一個初始化腳本,重新建立所有的表。該初始化腳本是通過HibernateTool自動生成的,稍后我們還會討論。下圖是單元測試的執行順序:
對DAO編寫單元測試 圖-2

  在編寫測試類之前,我們首先準備了一個TransactionCallback抽象類,該類通過Template模式將DAO調用代碼通過事務包裝起來:

 public abstract class TransactionCallback {

  public final Object  execute() throws Exception {

  Transaction tx =  HibernateUtil.getCurrentSession().beginTransaction();

  try {

  Object r =  doInTransaction();

  tx.commit();

  return r;

  }

  catch(Exception e) {

  tx.rollback();

  throw e;

  }

  }

  // 模板方法:

  protected abstract Object  doInTransaction() throws Exception;

  }
 

  其原理是使用JDK提供的動態代理。由于JDK的動態代理只能對接口代理,因此,要求DAO組件必須實現接口。如果只有具體的實現類,則只能考慮CGLIB之類的第三方庫,在此我們不作更多討論。

  下面我們需要編寫DatabaseFixture,負責啟動HSQLDB數據庫,并在@Before方法中初始化數據庫表。該DatabaseFixture可以在所有的DAO組件的單元測試類中復用:

 public class DatabaseFixture {

  private static Server  server = null; // 持有HSQLDB的實例

  private static final  String DATABASE_NAME = "javaeedev"; // 數據庫名稱

  private static final  String SCHEMA_FILE = "schema.sql"; // 數據庫初始化腳本

  private static final  List<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();

  }

  }

  );

  }

  }

上一頁1234下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 一本大道香蕉高清视频视频 | 欧洲男女啪啪免费观看 | 青青免费在线视频 | 中文国产欧美在线观看 | 国产免费久久精品99 | 色在线视频播放 | 成人私人影院在线观看网址 | 日本宅男午夜免费永久网站 | 在线观看亚洲人成网站 | 欧美日韩亚洲一区二区 | 一区二区三区 日韩 | 狠狠做五月深爱婷婷天天综合 | 在线观看不卡视频 | 免费永久观看美女视频网站网址 | 成人在线观看视频免费 | 成年影院在线看网站免费 | 丝袜制服第一页 | 午夜片在线 | 日韩专区亚洲综合久久 | 香蕉视频网页版 | 国产日韩欧美成人 | 日日操日日插 | 一级毛片毛片毛毛片毛片 | 日韩色影视 | 欧美成人精品 | 最近中文字幕2019免费版日本 | 美女视频黄色网址 | 亚洲天堂欧美 | 2019最新中文字幕 | 夜色资源网站 | 中文字幕视频在线播放 | 久操色| 最近日本韩国高清免费观看 | 一级特黄特色的免费大片视频 | 国产午夜精品一区二区三区不卡 | 在线观看黄日本高清视频 | 日韩精品首页 | 午夜国产精品久久影院 | 一区二区三区四区国产 | 国产午夜精品一二区理论影院 | 手机看片高清日韩精品 |