测试中的深度/嵌套依赖注入

时间:2016-03-07 07:47:41

标签: junit mockito mockmvc

我正在使用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);
    }
}

我需要测试此控制器的搜索方法,但是service2当前不是活动的,因此必须模拟对它的调用。我可以模拟service2,但无法弄清楚如何在我的控制器的mockMVC实例中注入一个service2的模拟。据我所知,模拟中的@InjectMocks只能注入一层深度而不是两层的模拟。

编辑:

我使用以下命令获取控制器的MockMVC实例

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

2 个答案:

答案 0 :(得分:0)

你不需要那个。

当您掌握需要完成的工作时,模拟search service就足够了。

示例:

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

  

在执行单元测试时,开发人员需要识别受测试系统并模拟/存根所有协作者。

因此,在这种情况下,您将为Controller和Search Service编写单独的单元测试。

另外,请阅读Martin Fowler撰写的this精彩文章 - Mocks Aren't Stubs

答案 1 :(得分:0)

您本质上想要做的是模拟一个豆子。

在这种情况下,您必须使用@MockBean注释为service2模拟bean。

有关详细信息,请参阅this article