首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Mockito测试涉及DB调用的Rest

使用Mockito测试涉及DB调用的Rest
EN

Stack Overflow用户
提问于 2018-02-26 14:49:17
回答 1查看 2.1K关注 0票数 0

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

例如,如果API如下所示

代码语言:javascript
运行
复制
 @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执行一个DB调用来从数据库获取ID。

现在当我做了

代码语言:javascript
运行
复制
 mockMvc.perform(MockMvcRequestBuilders.get("/todo/3")
 .accept(MediaType.APPLICATION_JSON)

它将进入数据库。

现在,通过这种方式,模拟越来越多地成为针对端点的Integeration测试。这样做对吗?

  1. 使用Mockito对命中外部实体(如DB或webservice )进行单元测试的正确方法是什么
  2. 如何模拟数据库,以及如何获得被模拟的DB数据。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-26 15:24:54

正如@pvpkiran所提到的,如果您测试一个单元,您将模拟该单元的引用。所以在这个案例中回答你的问题:

使用Mockito进行单元测试的正确方法是什么,以命中DB或webservice等外部实体?

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

代码语言:javascript
运行
复制
ToDoService toDoService = Mockito.mock(ToDoService.class)

然后告诉Mockito如何对特定的调用作出反应(无论是在安装方法中还是在测试方法中):

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
Mockito.when(toDoService.getToDoById(Matchers.anyLong())).thenReturn(toDo); //returns the created object for a call with any long value

如何模拟数据库,如果被模拟,如何获得DB数据?

在这种情况下,您会嘲笑整个服务。如果您想测试DAO,Spring (显然使用它)提供了一个可以使用sql脚本配置的嵌入式数据库。见文档

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48991145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档