2014-02-14 73 views
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); 
    } 
} 

此應用程序只有幾個測試,這幾乎測試什麼都沒有,所以我試圖覆蓋儘可能多的代碼儘可能與單元測試(在應用程序中會發生一些變化,這些變化需要對遺留代碼進行很多更改,而這些更改未包含在測試中)。我的問題是你將如何單元測試這樣的代碼。我有三個想法:

  1. 重構測試。我可以引入DAO層,並在那裏放置所有的entityManager調用。但沒有測試重構是總是 的問題。
  2. 模擬EntityManager。我用EasyMock試了幾次,它的工作原理是 ,並且幫助我至少有一些代碼覆蓋了代碼,它們需要更改,但可能不是很好的樣式,因爲您不應該使用 不屬於您的模擬api。此外,準備EntityManager模擬需要大量的時間和代碼
  3. 而不是單元測試,做與hsqldb或h2 和一些虛擬測試數據的集成測試。那麼這可能需要大多數 工作和測試會很慢。另外我想覆蓋大部分商業邏輯,而不是數據訪問。
+1

如果你還沒有得到它,首先去購買[有效地工作與遺產代碼](http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052) –

+0

謝謝,我會讀它,它看起來很有希望。 –

+0

作爲對選項3的評論:在像h2這樣的內存數據庫中一般都是'快速'的,但是你需要提供一些測試數據。如果您已經在某個其他數據庫中擁有此數據,則可以使用該數據或對該數據庫進行測試。首先執行起來會很慢,但是它會跳過重新開始並編寫單元測試過程。 – Dormouse

回答

0

我可能會首先添加一些集成測試,並獲取您想要重構的部分的覆蓋範圍。然後,您可以繼續重構更獨立的可單獨測試的單元。如果重構正確,您可以單獨從存儲單元測試您的業務邏輯。

進行一些集成測試總是一個好主意,所以這將是一個很好的開始。

在任何情況下,我都不會重構那些沒有被任何測試覆蓋的代碼。

相關問題