前言:在使用mock进行单元测试时,遇到了一个很奇怪的问题。比如一个测试类下有八个测试用例,其中有3个是使用了mock进行了模拟,同时彼此之间没有任何变量相联系。这八个测试用例单独一个个执行时没有任何报错,断言全部通过,但是当运行整个测试类时会发现有几个测试用例会报错,实际结果与预期结果有很大的偏差。

该问题主要是由于mock引起的,这里需要进行补充一下,一个测试用例的mock模拟,当你没有进行重置或者是还原替换,这个mock会一直伴随下去,被后续的测试用例使用,从而导致空指针等报错,或者是断言失败等问题出现。

在debug下能够看到一个含有mock的测试用例执行完后,下一个测试用例如果调用的是同一个方法类,会发现此时的方法类是被mock模拟的,也就是和上一个测试用例一样被mock所影响,从而导致这个测试用例出现错误。简单的来说就是:A中有mock,B中无mock,mock主要用于模拟C方法,A和B都会调用C。当测试类执行时,A先执行,模拟了C方法,使得A测试用例通过,之后执行B,但此时B所调用的C方法是A模拟的C方法,而不是原有的C方法,从而导致测试用例失败。

解决方法:

CareCourseCommentMapper careCourseCommentMapper = mock(CareCourseCommentMapper.class);
ReflectionTestUtils.setField(targetService,"targetMapper",careCourseCommentMapper);when(careCourseCommentMapper.selectById(anyLong())).thenReturn(careCourseComment);when(careCourseCommentMapper.deleteComment(anyLong())).thenThrow(new RuntimeException());ReflectionTestUtils.setField(targetService,"targetMapper",targetMapper);@Autowiredprivate CareCourseCommentMapper targetMapper;

若是前面模拟了mapper,那么在运行完后需要对mapper进行还原替换,确保mock只在这个测试用例中被模拟了,不会影响到其他的测试用例。即:如果前面进行了ReflectionTestUtils.setField进行了模拟替换和范围限制,并进行了模拟,那么在测试用例的结尾,我们需要对其进行还原,保证当测试用例运行完后,原有的方法类并没有受到影响,从而不会影响到后续的测试用例。

或者大家也可以试试reset方法,进行mock的重置替换,但该重置是重置到该测试用例的模拟处,这个方法主要用来对一个测试用例中要对mock模拟的方法进行二次修改,需要进行重置,大家也可以去试试。

mock模拟导致测试失败的解决方法相关推荐

  1. Postgres 异常断电导致启动失败的解决方法

    问题起因: 前段时间客户生产服务器,突然不小心弄断电了,虽然运维人员重启服务后,看似能正常访问,但是出现主从无法正常同步数据问题,而重新启动服务后,报could not connet to serve ...

  2. 微信小程序上传图片到服务器总是失败_微信小程序上传图片过大导致请求失败的解决方法...

    很多时候我们都会碰到小程序上传图片时因为图片过大而导致请求失败,同时出现各种各样的问题,那么今天来给大家写一个微信小程序上传图片过大导致请求失败的完美解决办法. 以云开发小程序图片检测为例,如果图片过 ...

  3. 【Matlab】关于matlab开启多核并行计算时SPMD测试失败的解决方法

    从官方网站找到了解决方法 根据操作一步步排除(当然要先把Parallel Computing Toolbox给装上): 确保证书可用 在matlab命令行中输入: license checkout D ...

  4. PyTorch官方安装方法下载太慢,直接用pip和conda命令安装,因为网络速度太慢,导致下载失败的解决的办法。

    PyTorch官方安装方法下载太慢,直接用pip和conda命令安装,因为网络速度太慢,导致下载失败的解决的办法. 最近在新的电脑上安装pytorch环境,由于网速太慢,你懂的,外网速度就是慢. 即使 ...

  5. update过程中遇到kb2829760补丁无法更新而导致vs安装失败的解决方法: 1、安装KB2829760; 2、安装KB2829760中文语言包; 3、安装VS2013 with upda

    update过程中遇到kb2829760补丁无法更新而导致vs安装失败的解决方法: 1.安装KB2829760: 2.安装KB2829760中文语言包: 3.安装VS2013 with update. ...

  6. Sublime Text 无法使用Package Control或插件安装失败的解决方法

    Sublime Text用了一年多了,公司搬家最近突然发现Package Control无法安装新插件了,虽然不影响原有功能的使用,还是要解决它.由于本人用Windows系统,只讨论Windosw下的 ...

  7. Sublime Text 无法使用Package Control或插件安装失败的解决方法【转】

    Sublime Text用了一年多了,公司搬家最近突然发现Package Control无法安装新插件了,虽然不影响原有功能的使用,还是要解决它.由于本人用Windows系统,只讨论Windosw下的 ...

  8. Electron在win7上加载plotyjs失败的解决方法

    Electron在win7上加载plotyjs失败的解决方法 错误详情 解决方法 错误详情 程序中使用plotjs,经过electron打包之后,在win10电脑上运行正常,在win7电脑上没有办法加 ...

  9. ecshop和Ucenter 通信失败终极解决方法!(附带php5.3以上,出现其他问题解决方法)

    原文地址:http://blog.jing.do/tech-955.html ecshop和Ucenter 通信失败终极解决方法!(附带php5.3以上,出现其他问题解决方法) 2014年06月24日 ...

最新文章

  1. 温水里的程序员,技术将淘汰一切。
  2. 这个机械装置真的能够分离彩色小球吗?
  3. 线程安全的单例模式的几种实现方法分享
  4. mysql修改表引擎Engine
  5. html5 滤色,深入理解CSS mix-blend-mode滤色screen混合模式
  6. 让delphi2010操作界面回到delphi7模式
  7. Android usb 权限广播,[Android]USB开发
  8. python函数定义中参数列表里的参数是_python函数定义中的参数说明
  9. Golang笔记—文件操作
  10. 给创业前的你4点建议
  11. ASCII控制字符在vi和notepadd++中的表示法
  12. oracle sqlplus执行脚本_oracle主、从自动切换方案?我是这样实现的
  13. pycharm项目目录结构_VOCs吸附回收装置和焚烧装置列入新版产业结构调整指导目录鼓励类项目...
  14. 〖数学算法〗开平方的七种算法
  15. 常见模拟电路设计 四 :比较器详讲
  16. 【论文精读】Learning Bounds for Importance Weighting
  17. 一次折腾人的打印机使用问题排查经历
  18. 什么是ACL和RBAC
  19. Spring Boot入门系列(六)Spring Boot如何整合Mybatis【附详细步骤】
  20. 1040 有几个PAT 测试点34

热门文章

  1. 如何在NCL(The NCAR Command Language )启动时自动加载自定义的函数和程序
  2. 关于Linux操作系统的一些简单英语
  3. macbook睡眠还掉电?阻止Mac休眠异常耗电的方法
  4. 业务扩张几十倍,运维却只有三人,这家企业是怎么做到的?
  5. “算力服务方阵”启动会暨“最强算力MAXP全球高性能云计算创新大赛”闭幕式在京召开
  6. 【NUCLEO_F767ZI开发板系列】一、开箱测试。
  7. 在1到100中找出所有和为100的数字组合
  8. K210开发板学习笔记(一)——K210人脸识别门禁+SD卡实现人脸数据存储(附代码解读)
  9. 2020ICPC济南站 A题 Matrix Equation高斯消元求异或方程组
  10. excel将字段自动转化为科学计数法解决方案