2008-10-20 140 views
10

我在我的代碼中有一個靜態方法,我想以某種方式來模擬。jmock嘲笑一種靜態方法

我正在使用jmock。

我想我可以做到這一點的一種方法是圍繞靜態方法使用「包裝類」,並且 模擬這個,但我希望有更好的解決方案。

我正在討論這個錯誤的方式?

反饋:

我將有一個接口和類,有一個方法,只是調用靜態方法。它可以讓我嘲笑對這個包裝類的調用來嘲弄邏輯。 (我覺得很髒,甚至談論它:))

+0

請參閱相關問題[如何模擬靜態方法](http://stackoverflow.com/questions/153048/how-to-mock-with-static-methods)。 – flicken 2008-10-20 15:43:22

回答

7

我們不支持在jMock中嘲諷靜態方法,因爲它不符合我們的設計方法。我們不希望將靜態方法用於影響系統狀態的重要功能。我們傾向於使用它們來支持OO代碼並使其更具可讀性。這就是爲什麼我們認爲嘲笑靜態方法是暗示有問題。一個例外是它在第三方庫中的位置,但我們可能會將它換成更面向對象的東西。

2

Powermock是EasyMock的擴展,允許模擬靜態方法。

5

JMockit是另一個允許模擬靜態方法(以及最終方法,構造函數等)的工具包。

在設計其他OO解決方案時,我沒有看到明智的靜態方法的使用問題。

例如,一個圖案/成語我喜歡使用的是靜態門面,特別是提供一種更簡單,更容易在商業應用中使用API​​來持久子系統。在我看來,沒有其他解決方案比像更優雅:


    List<Person> peopleAboveAge = 
     find("select p from Person p where p.age >= ?", age); 

其中find方法是靜態從PersistenceFacade類只定義靜態方法,並封裝如何獲取正確的會話/ EntityManager實例導入。這個解決方案是單元測試友好和靈活的。我在一個擁有500多個持久實體的業務應用程序中使用它,使用Hibernate。當我們從Hibernate 2遷移到Hibernate 3,從Oracle遷移到Sybase,然後再遷移到Oracle,以及我們開始使用JPA批註而不是用於ORM映射的「hbm.xml」文件時,靜態外觀有所幫助。