2012-02-07 37 views
1

我正在使用一些遺留代碼,我需要測試一些昂貴的服務被調用(它使網絡調用,發送電子郵件等)。在編譯時嘲笑

通過使用的框架(jboss seam 2),我可以注入一個假的服務而不是原來的服務。看到這個問題:Mock @org.jboss.seam.annotations.in behaviour for unittest

我現在想讓我的假對象成爲一個更聰明的模擬來斷言它是否已經被調用,等等。我希望它是Mockito或Easymock或其他東西模擬。但是,在測試中構建模擬的經典方法,然後注入它,由於接縫2和接縫測試處理注射的方式不起作用。請參閱上面的鏈接。

問題:有沒有辦法讓我的模擬擴展或註釋爲了成爲一個Mockito或模擬?我如何在測試中獲得對它的引用?

回答

5

我不同意你鏈接到的問題的答案。單元測試應該獨立於它應該工作的環境來測試這個類。依賴注入框架被精確地用來在單元測試中注入模擬依賴,而不需要任何複雜的環境來運行單元測試。

我不知道Seam,但它的文檔說@In可以放在一個屬性訪問器上。我只想有這樣被測類:

public class someBean implements Serializable { 
    private ApplicationBean applicationBean 

    @In 
    protected void setApplicationBean(ApplicationBean applicationBean) { 
     this.applicationBean = applicationBean; 
    } 
    ... 
} 

我只是調用制定者在單元測試中注入模擬。

您也可以讓代碼保持原樣,但提供一個setter或一個額外的構造函數以便能夠注入一個模擬applicationBean。

+0

我同意,但我已經嘗試過這種方法,注射沒有工作。鏈接的問題/答案基於接縫參考。我會再試一次您的建議,也許我錯過了一些小東西:) – dcernahoschi 2012-02-07 21:01:41

+0

這樣的事情怎麼會不起作用:'ApplicationBean mockApplicationBean = mock(ApplicationBean.class); SomeBean someBean = new SomeBean(); someBean.setApplicationBean(mockApplicationBean);'這是普通的Java。如果它不起作用,那麼制定者有一個錯誤。這種方法完全沒有使用Seam。 – 2012-02-07 21:07:22

+0

它似乎工作,沒有例外,但它使用正常的類而不是模擬。 – dcernahoschi 2012-02-07 21:12:40

1

您需要一個具有相同名稱但優先級較高的類。我已經做了大量的嘲笑。

您將相同的@name賦予您的模擬類並定義@install(precedence = MOCK)。只要這個類在類路徑中,它將被用來代替你的普通類(如果我沒有記錯的話,優先默認是應用程序)。 我剛纔沒有準備好代碼,但我嘲笑facesmessage例如,所以在測試期間,我可以從這個類讀取這些消息並驗證它們。

編輯:血腥的錯別字。