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

Junit 测试中的深度/嵌套依赖注入,junit,mockito,mockmvc,Junit,Mockito,Mockmvc,我正在使用junit、mockito和mockMVC来测试webapp的工作情况。我正在与一个依赖性作斗争,我无法理解它的注入。我的webapp结构如下 Class Controller{ @Autowired Service searchService; @RequestMapping("Search") public returnType search(@RequestParam("parameter")String parameter){ sea

我正在使用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的模拟。据我所知,mockito中的@InjectMocks只注入一层而不是两层

编辑:

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

MockMvc controller;
controller = MockMvcBuilders.standaloneSetup(Controller);
你不需要那个

模拟
搜索服务
就足够了,因为你已经掌握了需要做什么

例如:

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


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

所以,在本例中,您将为控制器和搜索服务编写一个单独的单元测试


另外,请阅读Martin Fowler的精彩文章-。

您实际上想要做的是模拟一个bean

在您的例子中,您必须使用@MockBean注释来模拟service2的bean


有关详细信息,请参阅。

但是我也无法测试搜索类的工作情况。我想在测试期间测试所有可以运行的系统。在执行单元测试时,您应该模拟/存根所有协作者。您需要为Search Service编写单独的单元测试,其中您将模拟Service2。我通过在测试类中直接使用searchService绕过了这个问题,因为控制器只是向它传递参数。然而,如果这种注射是可能的,请让我知道。感谢为了模拟Service2,您需要访问在单元测试期间创建的spring上下文。有多种方法可以访问spring上下文,您可以自动连接应用程序上下文,然后将Service2的模拟对象作为自动连接的主要候选对象注入,或者最好的方法是将其写入spring的xml(如果您有一个用于创建测试spring上下文的xml)。