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);
    }
}

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

编辑:

我正在使用以下内容来获取控制器的 MockMVC 实例

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

2 回答 2

1

你本质上想要做的是模拟一个bean。

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

详情请参考这篇文章

于 2019-08-31T04:10:51.840 回答
0

你不需要那个。

search service当您掌握需要做的事情时,模拟就足够了。

例子:

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

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

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

另外,请阅读Martin Fowler 的这篇精彩文章 - Mocks Aren't Stubs

于 2016-03-07T07:58:44.300 回答