• 0
  • 0
分享
  • Mock技术在JAVA微服务单元测试中的应用——软件测试圈
  • 曼倩诙谐 2023-04-11 13:33:39 字数 1910 阅读 1312 收藏 0

  摘要:在系统开发的过程中,单元测试是其中的一个重要环节。在Java微服务项目中,Spring框架本身就为我们提供了一套单元测试的框架SpringBootTest。如果我们在学校完成课堂作业或出于兴趣爱好自学,是可以使用Spring自带的单元测试框架进行单测的。

  工作中,这种通过SpringBootTest进行单元测试的方式则不推荐使用。其缺点在于,每次执行测试方法都必须启动Spring容器。当项目规模较大、配置较为复杂时,即使只对一个方法进行测试,也需要消耗大量时间启动Spring容器。当我们期望对DAO层方法进行测试时,该方法还有其他缺点:① 如果忘记加进行事务控制的注解,将可能导致数据库产生“脏数据”或数据缺失。② 当查询语句涉及大量连表查询时,查询效率可能十分低下,执行速度缓慢。③ 由于必须根据数据库中已有的数据来编写测试条件,每次必须先去数据库确保哪些数据存在、哪些数据不存在,再编写对应返回正确值、返回错误值的单元测试,开发效率低下。

  针对上述问题,可能有人会想到使用H2内存数据库的方式加以解决。不过,这依然无法有效地解决执行单元测试需要启动Spring容器的问题和上述问题③,假设我们期望执行用户查询返回一条姓名为xxx、年龄为xxx的记录,我们依然需要去sql文件中编写这一条记录的插入语句,并且也需要大量的配置。如果有很多条需要模拟的数据记录,就需要创建很多表、编写很多sql语句,开发效率依然大打折扣。

  此时,有一种很好的解决方案,既不需要和真实的数据库交互,也不需要启动Spring容器,同时又不需要编写大量的测试数据源,它就是Mock。使用Mock进行单元测试,我们可以直接模拟出结果,而不需要准备数据源。本文以简单的用户功能为例,说明如何使用Mock来进行DAO层的单元测试。

  1、使用Spring原生的方法进行测试。我们假设ID=1的用户记录是存在的,那么查询结果必定不为NULL。假设ID=2的用户记录是不存在的,那么查询结果必定为NULL。该方式需要启动Spring容器,并与数据库发生真实交互。

1-1.png

  2、使用Mock进行测试。该方式不需要启动Spring容器,也不与数据库发生真实交互。

  2.1、首先,引入Mock所需的pom依赖

1-2.png

  2.2、使用运行Mock框架的注解@RunWith(MockitoJUnitRunner.class)

  替换Spring原生单元测试的注解@SpringBootTest

1-3.png

  2.3、给Service层对象加上@InjectMocks注解,给Dao层对象加上@Mock注解。其中,@InjectMocks注解对象的方法会进行真实调用(会真实调用已编写的代码并返回执行结果),而@Mock注解对象的方法则是进行模拟调用(不会真实调用已编写的代码并返回我们设置的预期执行结果)。

1-4.png

  2.4、具体的单元测试方法中,通过Mockito.when(模拟方法).thenReturn(预期返回值)的方式,进行单元测试。

1-5.png

  上述方法中,“Mockito.when(userDAO.findUserById(1L)).thenReturn(new User())”的含义是,当userDAO调用findUserById进行查询且参数为1L时,会返回一个new的User对象。

  同理,“Mockito.when(userDAO.findUserById(2L)).thenReturn(null)”的含义是,当userDAO调用findUserById进行查询且参数为2L时,会返回一个空对象。

  当测试涉及的数据记录较多,逻辑较复杂时,使用Mock模拟DAO层的测试所提升单元测试的执行效率将更加明显。

  此外,当我们本地在开发调试时,如果数据库的测试数据发生了改变,那么我们单元测试的结果也会受到影响。例如,数据库中原本存在ID=1的记录,如果不小心删掉了,那么我们单测中Assert.assertNotNull的方法就会报错。而如果使用Mock的形式,无论数据库中是否存在该记录,我们执行DAO层方法的返回值都只依赖于我们在thenReturn方法中设置的值。

  总结一下使用Mock模拟DAO层方法测试的优点:

  1、不需要启动Spring容器

  2、不需要与数据库发生真实交互,不会导致脏数据产生、不会受到数据库真实数据的影响、不需要为了单元测试额外添加/修改/删除数据

  3、启动速度快、执行速度快、开发简单且效率高



作者:孙俊辉    

来源:http://www.51testing.com/html/11/n-7795511.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   过去几周对苹果公司来说并不好过。 在该公司准备最终推出 M4 MacBook Pro 系列产品的过程中,一系列广泛的泄密事件披露了大量细节。 不过,这些只是基本型号的信息,其余配置的信息一直欠奉,但现在不该公司似乎无意中泄露了较小的 14 英寸 M4 MacBook Pro 的规格,显示基本型号可以搭配更多内存。  Reddit 用户 Yunseok-12 在Google上搜索有关 M4 MacBook Pro 的泄露信息时,偶然发现了一张可能是 14 英寸机型潜在配置的图片。 该网站的链接似乎是正确的,但内容并不完整,缺少配图,"Built for Apple Intellig...
            0 0 190
            分享
          •   一、 功能测试  1. 点击分享按钮正确跳转分享页面,展示可分享的app,并进行分享跳转。  2. 页面默认展示自定义可分享app,有按钮支持更多app选择,过滤部分系统应用app。  3. 点击app分享,校验是否支持分享后打开链接。  4. 点击链接,其内容是否和原来的一致。  5. 是否支持取消分享。  6. 分享内容失败时,是否返回失败信息。  7. 分享内容成功,可选择留在app应用内还是返回浏览器。  8. 分享内容成功后,进入app可看到分享以链接形式展现, 展现内容为搜索标题以及搜索内容,无错别字布局合理。  9. 点击分享链接可进入浏览器展示链接内容。  二、容...
            0 0 383
            分享
          •   入行汽车电子行业已经要三年了,闲下来的时间爱总结总结,感受一下现在自己的行业水平,技术水平和发展想法。  首先,工作三年了,除了业务知识积累之外,我觉得增长更多的是沟通与做事方式的长进。经常挂在嘴边的一句话:“道理都懂,但就是不清楚怎么做。”从小学到大学,十几年甚至二十几年在学校里更多的是教会了自己如何快速高效的记忆,却并未就给自己太多思考的时间。  虽说到了大学后,时间多了,可以有很多思考的时间,但殊不知,思维差不多已经固化了,很多习惯好像在机械重复了多遍以后,就像是刻进了基因里,长进了骨子里,它让你很多个瞬间总是毫不犹豫的选择了那些个你觉得不确定的确定,所有的这些选择构成了我们现在的人...
            0 0 2351
            分享
          • Apifox 已推出 IDEA 插件 「Apifox Helper」 。Apifox Helper 是一款集成在 IDEA 中,帮助开发者自动解析代码注解并快速生成 API 文档的便捷工具。 Apifox Helper 是基于 javadoc(Java)、KDoc(Kotlin)、ScalaDoc(Scala)解析 API 文档,支持 Spring Boot、Swagger、JAX-RS 等协议框架,基本可以实现代码零入侵自动生成接口文档。在 IDEA 中使用 Apifox Helper 可以一键同步文档到 Apifox 项目中,开发者无需切换工具,即可更新同步文档给团队内其他人员。...
            0 0 1878
            分享
          •   苹果公司首席执行官蒂姆-库克正在越南河内进行为期两天的访问,期间他将会见供应商、应用程序开发人员和学生。越南和印度是苹果公司减少对中国过度依赖的受益国之一。除了增加AirPods和Apple Vision Pro 的生产外,苹果还将一些iPad的开发工作转移到了越南。  据当地出版物VNExpress 报道,库克于 2024 年 4 月 15 日星期一抵达河内,开始为期两天的访问。库克告诉当地媒体,他很高兴能与河内的客户、学生和应用程序开发人员见面。  据报道,苹果公司还公布了加强对越南承诺的计划。具体细节尚未公布,但苹果将增加对供应商的支出,并资助一项学校清洁水计划。  库克本人也在社交...
            0 0 561
            分享
      • 51testing软件测试圈微信