因為所有代碼(經過單元測試的產品級代碼)都是從HibernateUtil獲取Hibernate會話
所以能在同一個位置對其進行配置
為了對代碼的第一位進行單元測試而訪問TestSchema類將會激活靜態初始化程序
該程序將安裝Hibernate並且將測試SessionFactory插入到HibernateUtil中
對於產品級代碼
可以使用標准hibernate
cfg
xml配置機制來初始化 SessionFactory
那麼單元測試中的外部特征是什麼?下面的測試代碼片段是用來檢查邏輯的
決定運動員在棒球聯盟比賽中是哪個位置的人選
public void testGetEligiblePositions() throws Exception {
Player player = new Player(
playerId
);
TestSchema
addPlayer(player);
FieldingStint stint
= new FieldingStint
(
playerId
SEA
Position
CATCHER);
stint
setGames(
);
TestSchema
addFieldingStint(stint
);
Set<Position> positions = player
getEligiblePositions(
);
assertEquals(
positions
size());
assertTrue(ntains(Position
CATCHER));
}
第一次創建新Player實例並通過addPlayer()方法添加到TestSchema中
必須首先完成此步驟
因為FidldStint類和Player類之間有外鍵關系
如果不首先添加該實例
在設法添加FieldingStint時將會出現外鍵約束違例
一旦測試上下文就位
就可以測試getEligiblePositions()方法來檢索校正數據
下面是在TsetSchema中addPlayer()方法的代碼
您將注意到使用Hibernate而不是bare
metal JDBC代碼
public static void addPlayer(Player player) {
if (player
getPlayerId() == null) {
throw new IllegalArgumentException(
No primary key specified
);
}
Session session = HibernateUtil
getSession();
Transaction transaction = session
beginTransaction();
try {
session
save(player
player
getPlayerId());
mit();
}
finally {
session
close();
}
}
在單元測試中最重要的就是要保持測試實例是獨立的
因為該方法仍然涉及數據庫
所以需要一種方法在每個測試實例之前清理數據庫
在我的數據庫架構中有四個表
所以我在TestSchemaz上編寫了reset()方法
該方法從使用JDBC的表中刪除所有行
注意
因為HSQLDB能識別外鍵
刪除表的順序是很重要的
下面是代碼
public static void reset() throws SchemaException {
Session session = HibernateUtil
getSession();
try {
Connection connection = nnection();
try {
Statement statement = connection
createStatement();
try {
statement
executeUpdate(
delete from Batting
);
statement
executeUpdate(
delete from Fielding
);
statement
executeUpdate(
delete from Pitching
);
statement
executeUpdate(
delete from Player
);
mit();
}
finally {
statement
close();
}
}
catch (HibernateException e) {
connection
rollback();
throw new SchemaException(e);
}
catch (SQLException e) {
connection
rollback();
throw new SchemaException(e);
}
}
catch (SQLException e) {
throw new SchemaException(e);
}
finally {
session
close();
}
}
當確定在Hibernate
中進行大量刪除操作時
應該能從應用程序中刪除直接JDBC的最後一位
到此時為止
必須獲取數據庫連接並向數據庫直接提交SQL
在確保沒有關閉連接的情況下
為了釋放資源
只關閉會話就足夠了
出於手工編寫許多JCBC代碼來進行開發的習慣
第一個版本關閉了JDBC連接
因為通過配置Hibernate創建的連接池只帶有一個鏈接
在第一個之後就完全破壞了測試
一定要注意這種情況!
既然在測試類運行時(設想運行所有的測試實例)不能確定數據庫的狀態
應該在setUp()方法中包含數據庫清除
如下所示:
public void setUp() throws Exception {
TestSchema
reset();
}
結束語 在使用像Hibernate這種復雜的O/R映射程序時
必須能夠測試實際存在(real
live)的RDBMS
而不會發生任何針對已部署數據庫的爭論
雖然Hibernate有內置模式生成工具
讓此類測試特別簡單
但是在這裡展示的例子並不排除Hibernate
並且可能與JDO或TopLink一起運行
使用上面描述的設置
您不必離開舒適的IDE環境
但仍然可以對代碼進行大量測試
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28343.html