2016-03-07 94 views
1

我正在使用junit,mockito和mockMVC來測試webapp的工作。我正在苦苦掙扎着一個我無法弄清楚的注入問題。我的webapp結構如下。深度/嵌套依賴注入測試

Class Controller{ 

    @Autowired Service searchService; 

    @RequestMapping("Search") 
    public returnType search(@RequestParam("parameter")String parameter){ 
     searchService.doSearch(parameter); 
    }   
} 

和服務類

Class Service{ 
    @Autowired Service2 service2; 

    public returnType doSearch(String parameter){ 
     //some code 
     service2.call(parameter); 
    } 
} 

我需要測試的搜索方法爲控制器,但是服務2目前不活,因此調用它必須被嘲笑。我可以模擬service2,但無法弄清楚如何在控制器的mockMVC實例中注入一個service2模擬。就我所知,mockito中的@InjectMocks只注入了一個深度而不是兩個深度的嘲笑。

編輯:

我使用下列獲得控制器

MockMvc controller; 
controller = MockMvcBuilders.standaloneSetup(Controller); 
+0

爲了模擬Service2,您需要訪問在單元測試期間創建的spring上下文。 可以通過多種方式訪問​​Spring上下文,可以自動裝入應用程序上下文,然後注入Service 2的模擬對象作爲自動裝配的主要候選對象,或者最好的方法是將其寫入Spring的xml,如果有的話正在用於創建測試彈簧上下文。 –

回答

0

的MockMVC情況下你不需要這一點。

嘲笑search service就足夠了,因爲您可以掌握需要完成的工作。

例子:

doReturn(...).when(searchService).doSearch(any());

在執行單元測試,開發人員需要確定被測系統和模擬/存根所有的合作者。

因此,在這種情況下,您將爲控制器和搜索服務編寫單獨的單元測試。

另外,閱讀this輝煌的文章由馬丁福勒 - Mocks Aren't Stubs

+0

但我不能測試搜索類的工作。我想測試所有可以在測試過程中生活的系統。 –

+0

在執行單元測試時,您應該模擬/存根所有協作者。你需要爲Search Service編寫單獨的單元測試,其中你將模擬Service2。 –

+0

我直接在我的測試類中使用searchService,因爲控制器只是傳遞參數給它繞過了這個問題。但是,如果這樣的注射是可能的,請讓我知道。謝謝 –