*/
public void testConnectionProxyStart() {
int minConnections = 0;
int maxConnections = 0;
assertNotNull(cacheImpl);
try {
minConnections = Integer.parseInt(PropertyManager.getProperty
("DefaultConnectionProxy.minConnections"));
maxConnections = Integer.parseInt(PropertyManager.getProperty
("DefaultConnectionProxy.maxConnections"));
} catch (Exception e) {
// ignore the exception
}
assertEquals(cacheImpl.getMinLimit(), minConnections);
assertEquals(cacheImpl.getMaxLimit(), maxConnections);
assertEquals(cacheImpl.getCacheSize(), minConnections);
}
/** 對示例一中的對象進行獲取數據庫連接的測試,看看是否可以獲取有效的數據庫連接,
并且看看獲取連接后,連接池的狀態是否按照既定的策略進行變化。由于 assert 方法拋出的是
error 對象,因此盡可能把 assert 方法放置到方法的后集體進行測試,這樣在方法內打開的
資源,才能有效的被正確關閉。
*/
public void testGetConnection() {
int cacheSize = cacheImpl.getCacheSize();
int activeSize = cacheImpl.getActiveSize();
int cacheSizeAfter = 0;
int activeSizeAfter = 0;
con = conProxy.getConnection();
if (con != null) {
activeSizeAfter = cacheImpl.getActiveSize();
cacheSizeAfter = cacheImpl.getCacheSize();
try {
con.close();
} catch (SQLException e) {
}
} else {
assertNotNull(con);
}
/* 如果連接池中的實際使用連接數小于緩存連接數,檢查獲取的新的數據連接是否
從緩存中獲取,反之連接池是否建立新的連接
*/
if (cacheSize > activeSize) {
assertEquals(activeSize + 1, activeSizeAfter);
assertEquals(cacheSize, cacheSizeAfter);
} else {
assertEquals(activeSize + 1, cacheSizeAfter);
}
}
/** 對示例一中的對象進行數據庫連接釋放的測試,看看連接釋放后,連接池的
狀態是否按照既定的策略進行變化。由于 assert 方法拋出的是 error 對象,因此盡可
能把 assert 方法放置到方法的后集體進行測試,這樣在方法內打開的
資源,才能有效的被正確關閉。
*/
public void testConnectionClose() {
int minConnections = cacheImpl.getMinLimit();
int cacheSize = 0;
int activeSize = 0;
int cacheSizeAfter = 0;
int activeSizeAfter = 0;
con = conProxy.getConnection();
if (con != null) {
cacheSize = cacheImpl.getCacheSize();
activeSize = cacheImpl.getActiveSize();
try {
con.close();
} catch (SQLException e) {
}
activeSizeAfter = cacheImpl.getActiveSize();
cacheSizeAfter = cacheImpl.getCacheSize();
} else {
assertNotNull(con);
}
assertEquals(activeSize, activeSizeAfter + 1);
/* 如果連接池中的緩存連接數大于少緩存連接數,檢查釋放數據連接后是否
緩存連接數比之前減少了一個,反之緩存連接數是否保持為少緩存連接數
*/
if (cacheSize > minConnections) {
assertEquals(cacheSize, cacheSizeAfter + 1);
} else {
assertEquals(cacheSize, minConnections);
}
}
/** 釋放建立測試起始環境時的資源。
*/
protected void tearDown() {
cacheImpl = null;
conProxy.destroy();
}
public DefaultConnectionProxyTest(String name) {
super(name);
}
/** 你可以簡單的運行這個類從而對類中所包含的測試單元進行測試。
*/
public static void main(String args[]) {
junit.textui.TestRunner.run(DefaultConnectionProxyTest.class);
}
}
當單元測試完成后,我們可以用 Junit 提供的 TestSuite 對象對測試單元進行組織,你可以決定測試的順序,然后運行你的測試。
4. 如何維護單元測試
通過上面的描述,我們對如何確定和編寫測試有了基本的了解,但是需求總是變化的,因此我們的單元測試也會根據需求的變化不斷的演變。如果我們決定修改類的行為規則,可以明確的是,我們當然會對針對這個類的測試單元進行修改,以適應變化。但是如果對這個類僅有調用關系的類的行為定義沒有變化則相應的單元測試仍然是可靠和充分的,同時如果包含行為變化的類的對象的狀態定義與其沒有直接的關系,測試單元仍然起效。這種結果也是封裝原則的優勢體現。