使用Mockito进行数据库调用的Test Rest API

时间:2018-02-26 14:49:17

标签: java rest mockito

我需要对我的应用程序的基于REST的API进行一些单元测试。

现在,例如,如果API如下

 @RequestMapping(value = "/todo/{id}", method = RequestMethod.GET)
public ResponseEntity<ToDo> getToDoById(@PathVariable("id") long id) throws ToDoException{
    //Makes DB call
    ToDo toDo = toDoService.getToDoById(id);
 }

以上API执行数据库调用以从数据库中获取ID。

现在我做的时候

 mockMvc.perform(MockMvcRequestBuilders.get("/todo/3")
 .accept(MediaType.APPLICATION_JSON)

它会打到数据库。

现在,这种模拟方式正在变得越来越多地使用Integeration测试命中端点。这是正确的做法还是

  1. 使用Mockito进行单元测试的正确方法是点击外部实体,如DB或webservice

  2. 如何模拟数据库以及如何在模拟时获取数据库数据。

1 个答案:

答案 0 :(得分:2)

正如@pvpkiran所提到的,如果您测试一个单元,则模拟该单元的引用。所以在这种情况下回答你的问题:

  

使用Mockito进行单元测试的正确方法是使用DB或webservice这样的外部实体?

在单元测试中将模拟对象定义为类属性:

ToDoService toDoService = Mockito.mock(ToDoService.class)

然后告诉Mockito如何对特定电话做出反应(无论是在设置方法还是在您的测试方法中):

ToDo toDo = new ToDo(...);
//configure your todo object to satisfy your needs
Mockito.when(toDoService.getToDoById(123l)).thenReturn(toDo); //returns the created object only if called with 123l

Mockito.when(toDoService.getToDoById(Matchers.anyLong())).thenReturn(toDo); //returns the created object for a call with any long value
  

如何模拟数据库以及如何在模拟时获取数据库数据?

在这种情况下,您模拟整个服务。如果要测试DAO,Spring(您显然使用它)提供了一个嵌入式数据库,您可以使用sql脚本进行配置。见 documentation