2012-08-12 40 views
0

我的應用程序具有這樣的結構:有一個RepositoryFacade(這是一個Singleton),它使用許多其他ObjectRepository是辛格爾頓(UserRepository等)。如何JMock的一個Singleton

現在我想測試它,嘲笑[Objetct] Repositiries。要做到這一點我做了[Objetct] Repositiry實現一個接口,然後我想:

final IUserRepository mockIUserRepository= context.mock(IUserRepository.class); 
RepositoryFacade.getInstance().setUserRepository(mockIUserRepository); 
final User testUser = new User("username"); 

// expectations 
context.checking(new Expectations() {{ 
    oneOf (mockIUserRepository).save(testUser); 
}}); 
// execute 
RepositoryFacade.getInstance().save(testUser); 

而在RepositoryFacade我說:

public IUserRepository userRepository = UserRepository.getInstance(); 

但是,如果我嘗試運行測試,我獲得:

java.lang.SecurityException: class "org.hamcrest.TypeSafeMatcher"'s signer 
information does not match signer information of other classes in the same 
package 

ps最初我的RepositoryFacade沒有IUserRepository變量,我用它總是詢問UserRepository.getInstance()。what_i_want()。我介紹它嘗試使用JMock,所以如果不需要,我會很高興刪除Singleton的不良使用。

感謝, 安德烈

+2

恭喜,你發現單身人士是一個可怕的想法的原因之一。 :)我最好的建議:[擺脫他們](http://jalf.dk/singleton/) – jalf 2012-08-12 11:09:02

回答

2

你得到的錯誤提示,你有一個類加載問題與org.hamcrest包,而不是與你的單身的任何問題。有關此例外的更多信息,請參閱this question,關於Hamcrest和潛在解決方案的特定問題,請參閱this one

檢查你的類路徑,確保你沒有包含來自多個jar的衝突代碼。如果你在多個罐子中發現Hamcrest,可以通過改變它們在你的類路徑中的順序來改正。

Junit本身有兩個版本 - 一個可能包括舊版本的Hamcrest。切換到不包括hamcrest也可以解決您的問題。

如果你能找到一個方法來做到這一點,這將是從長遠來看,更好的擺脫單身的乾脆而不是使用像春天或吉斯做依賴注入。

但是你在做什麼應該工作,一旦你處理的類加載,這是一個合理的方式與單身在測試範圍內處理。

+0

首先,謝謝。在我的類路徑有:hamcrest核心-1.1.jar,hamcrest庫-1.1.jar,JMock的-2.5.1.jar,JMock的-junit4-2.5.1.jar。那麼,你認爲這是前兩者之間的「衝突」嗎?我試圖改變順序或類似的東西。讓你知道,謝謝 – andreaxi 2012-08-12 12:19:00

+0

沒有什麼變化,但可能這是關鍵:「使用JUnit-dep.jar而非junit.jar-這是JUnit的減其依賴的junit.jar包含舊版本Hamcrest的」 (src:你的第二個鏈接)。我會嘗試。 – andreaxi 2012-08-12 12:26:51

+0

是的,這是一個可能的解決方法。 – 2012-08-12 12:27:55