当前位置: 首页 > news >正文

junit使用

文章目录

  • 一 环境依赖
  • 二 mock的使用
  • 三 静态mock
  • 四 spy
  • 五 verify

  本文不搞junit的深层原理,只谈如何使用。

一 环境依赖

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.2</version><scope>test</scope>
</dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope>
</dependency>

二 mock的使用

  在单元测试中,在单独测试某个组件时,都是使用了挡板技术的,比如测试spring项目的service组件,就会把service调用到的dao设置为挡板。测试时不会去调用真正的dao,这样测试就不会影响到数据库,自然也不会受环境的影响,无论在开发环境还是SIT/UAT环境都可以顺利进行单元测试。下面是我写的例子,首先是我要测试的对象:

public class HelloService {private HelloDao helloDao;public void setHelloDao(HelloDao helloDao) {this.helloDao = helloDao;}public int hello() {return helloDao.query();}
}

  注意,我这里没有spring环境.
  接下来是我的mock测试代码:

@ExtendWith(MockitoExtension.class)
class HelloServiceTest {@InjectMocksprivate HelloService helloService;@Mockprivate HelloDao helloDao;@Testvoid hello() {Mockito.when(helloDao.query()).thenReturn(3);assertEquals(helloService.hello(),3);}
}

  测试通过。

三 静态mock

  静态mock需要注意两点:一是要及时关闭,这样不会影响其他测试类。二是只在当前线程有效。
  我先写个类:

public class StaticService {public String callStatic() {return HelloUtil.hello();}
}

  这个类调用了静态方法。测试的时候可以用静态mock,但是要记得关闭否则运行其他测试类会受到影响:

@ExtendWith(MockitoExtension.class)
class StaticServiceTest {@InjectMocksprivate StaticService staticService;private static MockedStatic<HelloUtil> helloUtil;@Testvoid callStatic() {helloUtil = Mockito.mockStatic(HelloUtil.class);helloUtil.when(()->HelloUtil.hello()).thenReturn("hello");String s = staticService.callStatic();assertEquals(s, "hello");}@AfterAllstatic void close() {helloUtil.close();}
}

  再试试多线程:

    @Testvoid parallel() throws ExecutionException, InterruptedException {helloUtil = Mockito.mockStatic(HelloUtil.class);helloUtil.when(()->HelloUtil.hello()).thenReturn("hello");String s = staticService.callStatic();assertEquals(s, "hello");FutureTask<String> task = new FutureTask<>(() -> staticService.callStatic());new Thread(task).start();String ret = task.get();assertEquals(ret, "hello");}

  测试结果就是失败了。

四 spy

  spy是另一种mock技术,用的是new出来的真实对象,但是可以改变部分方法的行为,适合那种部分方法需要mock的场景。我举个例子,这是我需要部分mock的类:

public class SpyDao {public String step1() {return "Hello";}public String step2() {return "world";}
}

  测试类的写法上会有点奇怪:

@ExtendWith(MockitoExtension.class)
class SpyServiceTest {@InjectMocksprivate SpyService spyService;@Spyprivate SpyDao spyDao = new SpyDao();@Testvoid call() {Mockito.doReturn("醒过来摸鱼").when(spyDao).step2();assertEquals("Hello, 醒过来摸鱼", spyService.call());}
}

五 verify

  verify是验证确实执行了某个方法。比如把上面的dao我加个方法,改成:

public class SpyDao {public String step1() {return "Hello";}public String step2() {return "world";}public String step3() {return "nothing";}
}

  其他代码不动,单元测试加上verify机制:

 @Testvoid call() {Mockito.doReturn("醒过来摸鱼").when(spyDao).step2();assertEquals("Hello, 醒过来摸鱼", spyService.call());verify(spyDao).step1();verify(spyDao).step3();}

  这个单元测试肯定失败,因为没走到step3()这个方法。好了,单元测试就介绍到这了,好久没写博客了。

http://www.dtcms.com/a/574060.html

相关文章:

  • 电商网站开发需要掌握哪些知识技能做黑彩网站会怎样处罚
  • 自制51单片机开发板:STC89C52RC最小系统+LCD1602A屏幕
  • 崇州网站制作网站下载软件
  • 实现El-table 每行后面加验证
  • 淘宝网站制作广州公共资源交易
  • 在IAR Embedded Workbench for Arm中开发和调试Infineon MOTIX™ MCU
  • 贵阳市花溪区建设局网站商河做网站公司
  • JDK Maven Tomcat部分配置细节(自用)
  • 网站开发文档步骤应该怎么写开网站设计公司多少钱
  • 城市超级智能体破解落地难题,联想开启智慧城市4.0时代
  • 小型企业门户网站源码电商平台开发系统软件平台
  • 【16】Selenium+Python 接管已打开谷歌浏览器
  • 公司网站导航栏是什么天堂 在线地址8
  • Lay-Vue-Super前后端分离的通用后台管理项目
  • 网站虚拟主机建设在线房屋设计免费图
  • Give LLMs a Security Course 论文结构速览
  • 经典的 VLM 攻击汇总
  • 山东网站方案秦皇岛网站建设找汉狮
  • 基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
  • phpstudy 无法启动mysql 但命令可以启动mysql
  • 【经典游戏】保姆级:Unity3D飞机大战(含资源包、完整项目)
  • Guava Cache淘汰算法
  • 门户网站类是什么意思怎么给自己做个网站吗
  • 小朋友做安全教育的网站慈溪做网站什么价
  • 设计一个网站的步骤深汕特别合作区包括哪些地方
  • 2.5 HuggingFace Transformers 库实战
  • 宿州建设企业网站公司做网站的有哪些学校
  • 网络通信的奥秘:HTTP详解 (七)
  • 福建网站建设科技有限公司那些网站做的非常好看的
  • 网站建设老李教学网站商务贸易网站建设