在Java微服务项目中,如何使用Mock来进行单元测试?

这篇具有很好参考价值的文章主要介绍了在Java微服务项目中,如何使用Mock来进行单元测试?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

java 本地mock,python,前端,性能优化,javascript,数据库,Powered by 金山文档

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

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

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

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

java 本地mock,python,前端,性能优化,javascript,数据库,Powered by 金山文档

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

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

java 本地mock,python,前端,性能优化,javascript,数据库,Powered by 金山文档

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

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

java 本地mock,python,前端,性能优化,javascript,数据库,Powered by 金山文档

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

java 本地mock,python,前端,性能优化,javascript,数据库,Powered by 金山文档

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

java 本地mock,python,前端,性能优化,javascript,数据库,Powered by 金山文档

上述方法中,“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、启动速度快、执行速度快、开发简单且效率高

最后:

可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!其中包括了有基础知识、Linux必备、Mysql数据库、抓包工具、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试持续集成、测试架构开发测试框架、性能测试等。

这些测试资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!文章来源地址https://www.toymoban.com/news/detail-565868.html

到了这里,关于在Java微服务项目中,如何使用Mock来进行单元测试?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nextjs构建服务端渲染,同时使用Material UI进行项目配置

    使用create-next-app来启动一个新的Next.js应用,它会自动为你设置好一切 运行命令: 执行结果如下:   启动项目: 执行结果:  启动成功!  根据Material UI官网介绍,截至2021年底,样式组件与服务器渲染的材质UI项目不兼容。这是因为babel-plugin风格的组件不能与@mui包中的style

    2024年02月08日
    浏览(33)
  • 如何一键部署本地Java项目到服务器上

    我开发了一个Java代码,现在想部署到服务器上,当然可以使用Jenkins部署,但是Jenkins配置和维护成本比较高,所以我今天分享的是轻量级的一键部署脚本 演示:本地Window的Java代码 - Vmware虚拟机Centos7上 如果你的项目结构不同,可以根据项目结构自行调整 1、对项目进行Maven编

    2024年01月20日
    浏览(36)
  • Spring Boot项目使用 jasypt 加密组件进行加密(例如:数据库、服务的Key、等等进行加密)

    🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝 🍓 更多文章请点击 密码配置项都不加密? 想啥呢? 一

    2024年02月07日
    浏览(39)
  • 消息服务应用1——java项目使用websocket

    在当前微服务项目中,由于业务模块众多,消息服务的使用场景变得异常活跃。而WebSocket由于其自身的可靠性强,实时性好,带宽占用更小的优势,在实时通讯应用场景中独占鳌头,加上HTML5标准的普及流行,在前端和后端开发中应用异常广泛。 一.关于WebSocket 1.WebSocket是什么

    2024年04月25日
    浏览(21)
  • 保姆级!如何在Window Server服务器上用tomcat部署java web项目

    首先,打开idae软件(我项目用的idea,也可以其他)导入你的项目,然后运行项目,确保项目能在localhost:8080,即在本地上运行。 确保能在本地上运行,且项目所有的已实现的功能没有bug,多测试几次。 然后打包项目,在打包前,看看数据库的.sql文件放在哪个位置(如果有的

    2024年02月06日
    浏览(35)
  • 如何使用Vite打包和部署项目到服务器二级路由

    如果你想把你用Vite构建的项目部署到服务器的二级路由上,比如 http://demo.dev/admin/  ,你需要注意以下几个步骤: 基础路径base是指你的项目在服务器上的相对路径,比如你的项目部署在  http://demo.dev/admin/  上,那么你的基础路径就是 /admin/ 。你需要在两个地方配置基础路径

    2024年02月04日
    浏览(30)
  • springboot项目要如何获取当前服务器的IP以及当前项目使用的端口号Port

    使用InetAddress类即可,直接看例子: 在配置文件中配置server.port的值,之后通过@Value、@ConfigurationProperties 等方法从配置文件中获取 测试代码: @Value会导致启动报错,无法启动项目: 把@Value注释,启动正常,但是**@ConfigurationProperties获取到的值是0** 我们知道springboot默认的po

    2023年04月08日
    浏览(36)
  • 教你如何使用vercel服务免费部署前端项目和serverless api

    vercel 是一个站点托管平台,提供CDN加速,同类的平台有 Netlify 和 Github Pages ,相比之下, vercel 国内的访问速度更快,并且提供 Production 环境和 development 环境,对于项目开发非常的有用的,并且支持持续集成,一次 push 或者一次 PR 会自动化构建发布,发布在 development 环境,

    2023年04月09日
    浏览(33)
  • 阿里云短信服务不对个人开放?如何在阿里云市场免费购买短信服务?云市场购买到的短信服务如何使用?(以谷粒学院项目为例)

    问题描述 : 在做谷粒学院项目时,需要使用阿里云的短信服务用于注册验证,但是阿里云的短信服务目前不对个人开放了,看到弹幕说可以在云市场购买,于是果断尝试了一把,这过程中又遇到头疼的依赖版本兼容问题,好在最终解决并测试成功了。在此把详细的操作流程

    2024年02月12日
    浏览(33)
  • 如何使用Docker将.Net6项目部署到Linux服务器(一)

    目录 一 配置服务器环境 1.1 配置yum                                                                                                                     1.1.1 更新yum包 1.1.2 yum命令 1.2 配置docker                                                           

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包