1. 程式人生 > >Hibernate 4開發之測試(JUnit)

Hibernate 4開發之測試(JUnit)

    說明:本文僅給出了使用Junit對編寫的持久化類及對映配置驗證的一個例子,對如何進行hibernate開發和配置及如何建立junit test case沒有介紹。

    hibernate開發過程中,當我們完成了持久化類開發和對映配置後,下一步是整合到團隊的程式碼庫中?或許很多人是這麼做的,忽略程式碼質量的檢測的是導致開發後期做系統整合時Bug氾濫的重要因素之一。

    白盒測試是軟體編碼過程中最重要的檢測方式,在使用hibernate 4做DAO模組開發時,通常會選擇Junit Test Case進行程式碼質量檢測。(從單元測試技術的角度來看,對持久化類和對映關係配置做測試,Junit Test Case屬於驅動模組。)

一、環境準備

        Eclipse  Java EE IDE for Web Developers(Mars.1 Release  4.5.1)

        hibernate 4.3.8 + JDK 7

二、測試程式碼

1. 持久化類(User)

package tcf.hibernate.bean;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;

//POJO
@Entity(name="t_user")
@Table
public class User {
	private int userid;//user id
	private String username;
	private String useraddress;
	private int userage;
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)//指定主鍵由資料庫自動生成
	public int getUserId() {
		return userid;
	}
	public void setUserId (int uid) {
		this.userid = uid;
	}
	
	// user name
	public String getUserName() {
		return username;
	}
	public void setUserName (String uname) {
		this.username = uname;
	}
	
	// user address
	@Column(name="useraddr")
	public String getUserAddre() {
		return useraddress;
	}
	public void setUserAddre (String uaddr) {
		this.useraddress = uaddr;
	}
	
	//user age
	public int getUserAge() {
		return userage;
	}
	public void setUserAge (int uage) {
		this.userage = uage;
	}
}

2. hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
	
<hibernate-configuration>
	<session-factory>
		<!-- 資料庫連線 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123123</property>
        
        <!-- 本地事務,及操作JDBC的一個數據庫 -->
        <property name="current_session_context_class">thread</property>

        <!-- 連線池Jdbc connection pool C3P0-->
        <property name="connection.pool_size">5</property>
        
        <!-- 方言dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 是否顯示sql語句Echo all executed SQL to stdout -->
		<property name="show_sql">true</property>
		<property name="format_sql">false</property>
		<property name="hbm2ddl.auto">update</property>
		
		
		<!-- 對映配置 -->
		<mapping class="tcf.hibernate.bean.User"/>
		
	</session-factory>
</hibernate-configuration>

3. JUnit程式碼

package tcf.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import tcf.hibernate.bean.User;

/* MAIN: @BeforeClass -> TEST* -> @AfterClass
 *		@BeforeClass, static, run once
 *		TEST*, test-cases is tagged by '@Test' one by one 
 *			TestCase 1: @Before -> @Test -> @After
 *			TestCase 2: @Before -> @Test -> @After
 *			...
 *			TestCase n: @Before -> @Test -> @After
 *		@AfterClass, static, run once
 */	
public class Junit2User {
	private static Configuration conf;
	private static SessionFactory sFactory;
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		conf = new Configuration().configure();
		StandardServiceRegistry reg = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
		sFactory = conf.buildSessionFactory(reg);
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		sFactory.close();
	}

	private Session session;
	private Transaction tr;
	
	@Before
	public void start() {
		session = sFactory.openSession();
		tr = session.beginTransaction();
	}
	
	@After
	public void end() {
		tr.commit();
		session.close();
	}
	
	
	@Test
	public void testSave() {
		User u = new User();
		
		u.setUserAddre("addr-junit");
		u.setUserAge(80);
		u.setUserName("name-junit");

		
		session.save(u);
	}
	@Test
	public void testSave2() {
		System.out.println("4");
		//fail("Not yet implemented");
		User u = new User();
		
		u.setUserAddre("addr-junit2");
		u.setUserAge(80);
		u.setUserName("name-junit2");

		
		session.save(u);

	}
}

4. Junit執行

    上面的Junit程式碼建立了兩個測試用例testSave1()、testSave2(),這兩個測試用例會順次執行,但執行的先後順序不一定。假設testSave1()先執行,各方法執行的過程如下:

setUpBeforeClass()

        ->start() -> testSave1() -> end()

        ->start() -> testSave2() -> end()

 ->  tearDownAfterClass()

相關推薦

Hibernate 4開發測試JUnit

    說明:本文僅給出了使用Junit對編寫的持久化類及對映配置驗證的一個例子,對如何進行hibernate開發和配置及如何建立junit test case沒有介紹。    hibernate開發過程中,當我們完成了持久化類開發和對映配置後,下一步是整合到團隊的程式碼庫中

iOS多線程開發GCD下篇

num 不能 每次 自定義 left void 類型 c函數 current 上篇和中篇講解了什麽是GCD,如何使用GCD,這篇文章將講解使用GCD中將遇到的死鎖問題。有興趣的朋友可以回顧《iOS多線程開發之GCD(上篇)》和《iOS多線程開發之GCD(中篇)》。

學習hibernate出現錯誤--方言

pda data cells bird nbsp 版本問題 inno 提高 語言 最近在學習hibernate,其中關於錯誤的問題真是一頭大,各種各樣的奇葩錯誤層出不窮,簡直是受不了了。 用hibernate操作數據庫,在使用hibernate進行把持久

Android 開發 ---- bootloader LK

ttl tab 不同的 opera 指定 isa system void mem LK是什麽 LK 是 Little Kernel 它是 appsbl (Applications ARM Boot Loader)流程代碼 ,little kernel

前端基於react,後端基於.net core2.0的開發1 介紹

tco ioc logs asp webpack 路由 src 部署 關鍵字 文章提綱目錄 1.前端基於react,後端基於.net core2.0的開發之路(1) 介紹 2.前端基於react,後端基於.net core2.0的開發之路(2) 開發環境的配置,

android開發Animation

protected html err nim package 設置圖 move 函數 star android開發之Animation的使用(五) 本博文主要講述的

python開發

數字 美團 其中 class 翻譯 電視 ... 硬件 算數運算 一、python基礎入門 1、編程語言 程序員與計算機溝通的語言就叫做編程語言 編程語言發展至今經歷了以下: ①.機器語言:站在計算機(奴隸)的角度,說計算機能聽懂的語言,那就是直接用二進制編程,直接操作

AndroidStudio androidTest安卓測試 test單元測試Junit

 androidTest是整合測試,可以執行在裝置或虛擬裝置上,需要編譯打包為APK在裝置上執行,可以實時檢視細節 test 是單元測試,執行在本地開發機上,可以脫離Android執行環境,速度快 Android Studio 測試分 androidTest 安卓測試(下圖綠箭頭)

iOS開發runtime:runtime除錯環境搭建

本系列部落格是本人的原始碼閱讀筆記,如果有iOS開發者在看runtime的,歡迎大家多多交流。為了方便討論,本人新建了一個微信群(iOS技術討論群),想要加入的,請新增本人微信:zhujinhui207407,【加我前請備註:ios 】,本人部落格http://www.kyson.cn 也在不停的更新中,歡迎

【轉載】iPhone開發NSNotificationCenter通知的使用方法

iPhone軟體開發的時候會遇到這種情況:開啟APP後會在後臺執行某個方法,例如下載檔案,下載完成後可能需要呼叫某個方法來重新整理介面,這時候可能沒法在下載的函式中回撥。NSNotificationCenter(通知)是一個很好的選擇。 通知使用起來灰常的簡單: 1、定義通知:[[NSNotifica

iPhone開發NSNotificationCenter通知的使用方法

iPhone軟體開發的時候會遇到這種情況:開啟APP後會在後臺執行某個方法,例如下載檔案,下載完成後可能需要呼叫某個方法來重新整理介面,這時候可能沒法在下載的函式中回撥。NSNotificationCenter(通知)是一個很好的選擇。 通知使用起來灰常的簡單: 1

Android開發計算器介面設計activity_main佈局檔案

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schem

Android開發計算器介面設計

        計算器開發主要涉及到LinearLayout佈局、EditText、Button的使用。為android入門基礎內容。 開啟android studio選擇建立一個新的工程,應用程式的名稱為CalculateApp,公司域可以設定,也可以不設定,我設定的如圖所示 點選“next”,選擇支援的最

[Java開發路]8輸入流和輸出流

1. Java流的分類 按流向分: 輸入流: 可以從其中讀入一個位元組序列的物件稱作輸入流。 輸出流: 可以向其中寫入一個位元組序列的物件稱作輸出流。 這些位元組序列的來源地和目的地可以是檔案,而且通常都是檔案,但是也可以是網路連線,甚至是記憶體塊。抽象類Input

小強的HTML5移動開發49——HTML5開發神器HBuilder

今天給大家介紹一款開發HTML5的神器——HBuilder.下載地址:http://www.dcloud.net.cn/一、新建檔案可以看到支援web app開發和普通網站前端開發,我們首先建立一個移動App專案註釋:HTML5+規範是基於HTML5的擴充套件規範,用於彌補H

iOS開發快取:記憶體快取

點選有驚喜 前面一片文章介紹瞭如何上傳和下載檔案,這篇文章將介紹一下如何在iOS裝置中進行快取。 這篇文章將只介紹一下將內容快取到記憶體中,下一篇文章就介紹一下在iOS磁碟上快取內容。 使用快取的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的執行

webkit瀏覽器開發——環境搭建

      最近在著手開發一款手機瀏覽器,於是便用到了非常受歡迎的webkit,將自己的學習經過記錄下來,希望能和大家一同探討學習。       第一篇文章就詳細說一下環境如何搭建。       準備工作:    (1)學習文章:搞清楚一些基本的東西,建議看英文的。 htt

Android開發RecyclerView初步使用

首先要感謝前面的大佬們的總結,給了我站在巨人肩膀上的機會。文中有不對的地方還望大佬指出,如有大佬覺的侵權的地方還望指出,鄙人將以最快速度修改!好了,話不多少了,開始開車! 第一步:匯入RecyclerView compile 'com.android.support:re

[JNI]開發7JNI函式中呼叫java物件的方法

在jni函式中我們不僅要對java物件的資料域進行訪問,而且有時也需要呼叫java中類物件已經實現的方法。接下來我們對物件的方法呼叫,呼叫步驟與訪問資料域相似。 1.獲得例項對應的class類 2.根據class類獲得方法的method id 3.根據me

IOS開發HomeKit

       IOS10中已經自帶了homekit程式。現在由於支援該框架的硬體裝置有限,所以homekit應用還是比較少的,但是由於工作需要,我還是瞭解和學習了一些這方面的知識在這裡還是將這些東西記錄下來,方便以後翻閱,也為剛開始瞭解這方面的小夥伴們提供一些參考。硬體