2016-03-07 125 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,因为控制器只是传递参数给它绕过了这个问题。但是,如果这样的注射是可能的,请让我知道。谢谢 –