mockito mock void方法_使用 Junit + Mockito 实践单元测试!
一、前言
相信做过开发的同学,都多多少少写过下面的代码,很长一段时间我一直以为这就是单元测试...
@SpringBootTest
@RunWith(SpringRunner.class)
public class UnitTest1 {
@Autowired
private UnitService unitService;
@Test
public void test() {
System.out.println("----------------------");
System.out.println(unitService.sayHello());
System.out.println("----------------------");
}
}
但这是单元测试嘛?unitService 中可能还依赖了 Dao 的操作;如果是微服务,可能还要起注册中心。那么这个“单元”也太大了吧!如果把它称为集成测试,可能更恰当一点,那么有没有可能最小粒度进行单元测试嘛?
单元测试应该是一个带有隔离性的功能测试。在单元测试中,应尽量避免其他类或系统的副作用影响。
单元测试的目标是一小段代码,例如方法或类。方法或类的外部依赖关系应从单元测试中移除,而改为测试框架创建的 mock 对象来替换依赖对象。
单元测试一般由开发人员编写,通过验证或断言目标的一些行为或状态来达到测试的目的。
二、JUnit 框架
JUnit 是一个测试框架,它使用注解来标识测试方法。JUnit 是 Github 上托管的一个开源项目。
一个 JUnit 测试指的是一个包含在测试类中的方法,要定义某个方法为测试方法,请使用 @Test 注解标注该方法。该方法执行被测代码,可以使用 JUnit 或另一个 Assert 框架提供的 assert 方法来检查预期结果与实际结果是否一致,这些方法调用通常称为断言或断言语句。
public class UnitTest2 {
@Test
public void test() {
String sayHello = "Hello World";
Assert.assertEquals("Hello World", sayHello);
}
}
以下是一些常用的 JUnit 注解:
以下是一些常用的 Assert 断言:
三、Mockito 框架
从上面的介绍我们可以认识到,如何减少对外部的依赖才是实践单元测试的关键。而这正是 Mockito 的使命,Mockito 是一个流行的 mock 框架,可以与 JUnit 结合使用,Mockito 允许我们创建和配置 mock 对象,使用 Mockito 将大大简化了具有外部依赖项的类的测试开发。spring-boot-starter-test 中默认集成了 Mockito,不需要额外引入。
在测试中使用 Mockito,通常会:
mock 外部依赖关系并将 mock 对象插入待测代码
执行被测代码
验证代码是否正确执行
3.1 使用 Mockito 创建 mock 对象
Mockit o提供了几种创建 mock 对象的方法:
使用静态 mock() 方法
使用 @Mock 注解
如果使用 @Mock 注解,则必须触发创建带有 @Mock 注解的对象。使用 MockitoRule 可以做到,它通过调用静态方法 MockitoAnnotations.initMocks(this) 来填充带 @Mock 注解的字段。或者可以使用 @RunWith(MockitoJUnitRunner.class)。
public class UnitTest3 {
// 触发创建带有 @Mock 注解的对象
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
// 1. 使用 @Mock 注解创建 mock 对象
@Mock private UnitDao unitDao;
@Test
public void test() {
// 2. 使用静态 mock() 方法创建 mock 对象
Iterator iterator = mock(Iterator.class);
// when...thenReturn / doReturn...when 模拟依赖调用
when(iterator.next()).thenReturn("hello");
doReturn(1).when(unitDao).delete(anyLong());
// 断言
Assert.assertEquals("hello", iterator.next());
Assert.assertEquals(new Integer(1), unitDao.delete(1L));
}
}
3.2 使用 mock 对象实践单元测试
我们要单元测试的内容,常常包含着对数据库的访问等等,那么我们要如何 mock 掉这部分调用呢?我们可以使用 @InjectMocks 注解创建实例并使用 mock 对象进行依赖注入。
@Service
public class UnitServiceImpl implements UnitService {
@Autowired
private UnitDao unitDao;
@Override
public String sayHello() {
Integer delete = unitDao.delete(1L);
System.out.println(delete);
return "hello unit";
}
}
@RunWith(MockitoJUnitRunner.class)
public class UnitTest2 {
@Mock
private UnitDao unitDao;
@InjectMocks
private UnitServiceImpl unitService;
@Test
public void unitTest() {
// mock 调用
when(unitDao.delete(anyLong())).thenReturn(1);
Assert.assertEquals("hello unit", unitService.sayHello());
}
}
Mockito 还有很多有趣的实践,比如:@Spy或spy()方法、verify()验证等等,鉴于篇幅原因,读者可自行挖掘。
3.3 使用 PowerMock mock 静态方法
Mockito 也有一些局限性。例如:不能 mock 静态方法和私有方法。有关详细信息,请参阅 Mockito限制的常见问题解答。这个时候我们就要用到 PowerMock,PowerMock 支持 JUnit 和 TestNG,扩展了 EasyMock 和 Mockito 框架,增加了mock static、final 方法的功能。
首先需要引入 PowerMock 的依赖:
org.powermock
powermock-module-junit4
2.0.7
test
org.powermock
powermock-api-mockito2
2.0.7
接下来就能愉快的 mock 静态方法了。
@RunWith(PowerMockRunner.class)
@PrepareForTest({StringUtils.class})
public class UnitTest4 {
@Test
public void test() {
mockStatic(StringUtils.class);
when(StringUtils.getFilename(anyString())).thenReturn("localhost");
Assert.assertEquals("localhost", StringUtils.getFilename(""));
}
}
链接:https://www.cnblogs.com/jmcui/p/12802099.html
本文为51Testing经授权转载,转载文章所包含的文字来源于作者。如因内容或版权等问题,请联系51Testing进行删除
推荐阅读
点击阅读☞谈谈对于保障代码质量至关重要的单元测试!
点击阅读☞Selenium自动化测试之Unittest单元测试框架的使用!
点击阅读☞Python 单元测试中处理用例失败的情况
点击阅读☞谈谈对于保障代码质量至关重要的单元测试!
点击阅读☞原来 iOS 单元测试可以这么简单……
戳
mockito mock void方法_使用 Junit + Mockito 实践单元测试!相关推荐
- mockito mock void方法_一文让你快速上手 Mockito 单元测试框架(上)
作者|mghio 编辑|包包 前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改 ...
- mockito mock void方法_用过举手!SpringBoot 单元测试利器Mockito
Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean.模拟方法的返回值.模拟抛出异常...等,在了解 Mockito 的具 ...
- mockito mock void方法_一文让你快速上手 Mockito 单元测试框架
前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...
- mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用
本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用.本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山.本文将使用mock ...
- mockito mock void方法_Spock如何模拟抽象类方法
我们平时写单元测试时经常会遇到调用抽象类或父类的方法,这些抽象方法可能是调用底层接口或数据库,需要mock掉,让抽象方法返回一个我们指定的值,以便测试当前代码逻辑的场景. 下面讲下Spock如何结合p ...
- java mock void_如何使用Mockito模拟void方法 - How to mock void methods with Mockito
问题: How to mock methods with void return type? 如何用void返回类型模拟方法? I implemented an observer pattern bu ...
- 如何使用Mockito模拟void方法
如何用void返回类型模拟方法? 我实现了一个观察者模式,但是我不能用Mockito模拟它,因为我不知道怎么做. 我试图在互联网上找到一个例子,但没有成功. 我的课看起来像这样: public cla ...
- Mockito测试void方法会引发异常
本文翻译自:Mockito test a void method throws an exception I have a method with a void return type. 我有一个vo ...
- java怎么调用void方法_如何使用反射在java中调用void方法
如果我使用反射调用方法,我可以让它正常工作而不抛出空指针异常的唯一方法是在我调用的方法中返回一个int值. 例如,我想调用的方法: public int setScore(int n) { this. ...
最新文章
- MVC系列框架之Struts存在的意义是什么?
- 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)
- [JavaWeb基础] 025.JAVA把word转换成html
- 1.2 Object类详解
- 如何选择一个合适的建站系统?
- matlab的数值计算功能,MATlAB数值计算功能
- 活动延期通知 | 7.31 阿里云 Serverless Developer Meetup 杭州站本周六见!
- 字符设备驱动高级篇1——新接口介绍
- linux内存管理之RSS和VSZ的区别
- ios双指放大缩小_用PS设计APP过程中改进IOS设计流程的30个秘诀
- JSP-Runoob:JSP 自定义标签
- Android开源项目推荐之「图片加载到底哪家强」
- Photoshop CS5无法卸载或卸载不干净怎么办?
- centos刻录工具_带来一篇CentOS下刻录光盘
- qq互联登录授权php配置,开通qq互联开放平台登陆功能的步骤
- codeforces 1436E Complicated Computations
- 不应被忘记的历史——聊聊前阿布时代的切尔西
- vs(c++)修改图标
- 计算机实训项目结果文档,计算机基础实训报告.doc
- leetcode之Isomorphic strings
热门文章
- .NET Core 事件总线,分布式事务解决方案:CAP
- mysql索引有哪些了解_Mysql索引(简单了解)
- Windows11右下角出现评估副本水印如何去除?
- C++语言打印汉字表
- C和指针之strcat函数 strchr函数 strcmp函数 strcpy函数 strnchr函数 strstr函数实现
- IOS学习笔记之二十二(文件io)
- Android之如何用dextra.ELF64查看安卓手机“设置“图标的源代码
- Android之ActivityManage长用方法总结
- 我的世界java版forge怎么用_我的世界电脑版MOD怎么用 我的世界pc版forge怎么安装...
- 这6部超经典的物理电影,居然还有人没有看过?