2017-07-09 67 views
1

在構建單元測試的同時,我正努力嘗試實現以下功能: 我想要一個接收Varargs類的函數,並且將有能力實例化每個給定的類。 這件事情是這樣的:在函數中創建不同類的實例

public static void mockContextBeans(Class<?>... classes) throws Exception{ 
     for (Class<?> c : classes){ 
      when(context.getBean(c)).thenReturn(c.newInstance()); 
     } 
    } 

可有人請點我到正確的方式實現它?

感謝

+1

這看起來很像你試圖模仿春天 - 不要那樣做。 Spring提供了功能強大且完整的[用於測試Spring的系統](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/testing-introduction.html)。不要試圖重寫自己,要麼你會失敗,要麼會花費你幾個月的開發時間。 –

+0

正如您的參考文獻中所述: _組成您的應用程序的POJO應該可以在JUnit或TestNG測試中測試,對象只需使用新運算符實例化,不需要Spring或任何其他容器。你可以使用模擬對象(結合其他有價值的測試技術)來單獨測試你的代碼。這是我試圖實現的目標,我在代碼中有部分代碼,其中有如下行:「context.getBean (...)「,我想嘲笑他們。 假設我不能更改生產代碼。 –

+2

_「我在代碼中有部分代碼,其中有像'context.getBean(...)'_」 - eugh。你的問題就在那裏。你的代碼**不是**單元可測試的,因爲你陷入了經典的使用'ApplicationContext'作爲多用途魔法工廠的反模式。如果您**需要將'ApplicationContext'注入到bean中,請退後一步並考慮另一種方式。 –

回答

0

你對抗春季的方式是應該被使用,但如果你真的需要,使這項工作,你可能會說....thenReturn(Mockito.mock(c))。 Mockito不應該關心類中存在的構造函數。

+0

我想你需要知道模擬模擬的行爲。目前的方法(不起作用,但如果它......)通過使用實際的實例來解決這個問題,所以它們的行爲應該是他們應該的。當然可以添加一個巨大的案例開關並添加行爲,或者添加一個應答服務,但這一切都開始變得很複雜。 –

+0

當試圖去用這種方法我得到以下錯誤: _Type不匹配:無法從捕獲#2轉換?捕捉#1的? –

相關問題