3
我被分配到舊的Web應用程序(JSF 1.2 + Eclipselink),沒有像EJB或Spring這樣的中間件,應用程序的服務層由直接調用EntityManager的POJO組成。代碼的結構就像這個SomeBean(支持bean) - > SomeServices(這裏是混合的業務邏輯和數據訪問代碼),沒有獨立的DAO層。在服務類中的代碼通常看起來是這樣的(這裏很簡單):如何對舊的舊應用程序進行單元測試
public void someMethod(SomeEntity someEntity, ....) throws SomeServiceExeption {
try{
entitiyManager.getTransaction.begin();
//lotOfLogicHereAndCallingSomeOtherPrivateMethods
entitiyManager.getTransaction.commit();
}catch(Exception e){
log.error("");
if(entitiyManager.getTransaction..isActive()){
entitiyManager.getTransaction.rollback();
}
throw new SomeServiceExeption(e);
}
}
此應用程序只有幾個測試,這幾乎測試什麼都沒有,所以我試圖覆蓋儘可能多的代碼儘可能與單元測試(在應用程序中會發生一些變化,這些變化需要對遺留代碼進行很多更改,而這些更改未包含在測試中)。我的問題是你將如何單元測試這樣的代碼。我有三個想法:
- 重構測試。我可以引入DAO層,並在那裏放置所有的entityManager調用。但沒有測試重構是總是 的問題。
- 模擬EntityManager。我用EasyMock試了幾次,它的工作原理是 ,並且幫助我至少有一些代碼覆蓋了代碼,它們需要更改,但可能不是很好的樣式,因爲您不應該使用 不屬於您的模擬api。此外,準備EntityManager模擬需要大量的時間和代碼
- 而不是單元測試,做與hsqldb或h2 和一些虛擬測試數據的集成測試。那麼這可能需要大多數 工作和測試會很慢。另外我想覆蓋大部分商業邏輯,而不是數據訪問。
如果你還沒有得到它,首先去購買[有效地工作與遺產代碼](http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052) –
謝謝,我會讀它,它看起來很有希望。 –
作爲對選項3的評論:在像h2這樣的內存數據庫中一般都是'快速'的,但是你需要提供一些測試數據。如果您已經在某個其他數據庫中擁有此數據,則可以使用該數據或對該數據庫進行測試。首先執行起來會很慢,但是它會跳過重新開始並編寫單元測試過程。 – Dormouse