我们项目一般都是 MVC 分层的,而单元测试主要是在 Dao 层和 Service 层上进行编写。从项目结构上来说,Service 层是依赖 Dao 层的,但是从单元测试角度,对某个 Service 进行单元的时候,他所有依赖的类都应该进行Mock。而 Dao 层单元测试就比较简单了,只依赖数据库中的数据。

一 、Mockito

Mockito是mocking框架,它让你用简洁的API做测试,是为了简化单元测试过程中测试上下文 ( 或者称之为测试驱动函数以及桩函数 ) 的搭建而开发的工具
入坑Mockito吧,骚年!

不说废话,看如何使用就好!

1 pom导入依赖

SpringBoot 中的 pom.xml 文件需要添加的依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

该依赖中已经有单元测试所需的大部分依赖,如:junit、mockito、hamcrest。若为其他 spring 项目,需要自己添加 Junit 和 mockito 项目。

2 mockito使用

常用方法汇总:(温馨提示,Ctrl+F示例名在代码中找示例 ^ _ ^ )

方法名 描述 示例
Mockito.mock(classToMock) 模拟对象 test_mock_class()
Mockito.verify(mock) 验证行为是否发生
Mockito.when(methodCall).thenReturn(value1).thenReturn(value2) 触发时第一次返回value1,第n次都返回value2
Mockito.doThrow(toBeThrown).when(mock).[method] 模拟抛出异常
Mockito.mock(classToMock,defaultAnswer) 使用默认Answer模拟对象
Mockito.when(methodCall).thenReturn(value) 参数匹配
Mockito.doReturn(toBeReturned).when(mock).[method] 参数匹配(直接执行不判断)
Mockito.when(methodCall).thenAnswer(answer)) 预期回调接口生成期望值
Mockito.doAnswer(answer).when(methodCall).[method] 预期回调接口生成期望值(直接执行不判断)
Mockito.spy(Object) 用spy监控真实对象,设置真实对象行为
Mockito.doNothing().when(mock).[method] 不做任何返回
Mockito.doCallRealMethod().when(mock).[method] //等价于Mockito.when(mock.[method]).thenCallRealMethod(); 调用真实的方法
reset(mock) 重置mock

实例代码:

@RunWith(SpringRunner.class)        //Runner 来运行你的测试代码
//classes属性指定启动类,WebEnvironment.RANDOM_PORT随机生成一个端口号
@SpringBootTest(classes = XXXApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING) //按照方法名字顺序执行
@ActiveProfiles(value = "test")     //声明在为测试类加载ApplicationContext时应使的定义配置文件
public class MockitoXXXServiceTest {@MockBeanprivate AService aService;//当以下XXXDAO同时以@MockBean和@Resource的方式存在时,@Resource不生效//也就是说,xXXDAO1.insert(xXX)将不会真的把xXX插入数据库中@MockBean private XXXDAO xXXDAO;@Resource private XXXDAO xXXDAO1;//本类mock出来的AService、XXXDAO等将会被注入到XXXService中,xXXDAO1.insert(xXX)将不会真的把xXX插入数据库中@InjectMocks                       //创建一个实例,类中用@Mock(或@Spy)注解创建的mock将被注入到用该实例中@Resource                            private XXXService xXXService;// 注意这两个都是静态方法,所有测试方法执行前执行一次,所有测试方法后执行一次@BeforeClasspublic static void setUpClass(){}@AfterClasspublic static void destroyClass(){}//下面两个每一个test运行前后各执行一次@Before                         public void setUp() {}@Afterpublic void destroy() {}@Test(timeout = 1000)                //测试方法执行超过1000毫秒后算超时,测试将失败public void test_timeout(){}@Ignore("ignore this test")         //执行测试时将忽略掉此方法,如果用于修饰类,则忽略整个类public void test_ignore(){}@Test                                //public void test_copy_1() {Mockito.when(accountService.getCurrTenant()).thenReturn("TDH");Mockito.doNothing().when(scheduler).schedule(Mockito.any(OpsJobTaskIds.class));assertThat("type_a",equalTo("type_a"));assertThat(detail.equalsContent(result), is(true));}

参考文章:https://www.jianshu.com/p/ecbd7b5a2021

3 升级版

注意:以下需要用到PowerMockito的需要引入依赖:

     <dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-core</artifactId><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito</artifactId><scope>test</scope></dependency>

MOCK静态方法

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class Test {@InjectMocks@Resourceprivate B b = new B();@Test(expected = IOException.class)public void testIOException() {PowerMockito.mockStatic(A.class);PowerMockito.when(A.method()).thenThrow(new IOException());b.service();}
}

Unit Test(UT)单元测试相关推荐

  1. 第二章 UT单元测试——GTest框架实例

    系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 文章目录 系列文章目录 前言 一.环境配置 二.使用步骤 1.添加待测源码 2.修改 ...

  2. 第一章 UT单元测试——GoogleTest通用构建说明

    系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 文章目录 系列文章目录 前言 GoogleTest通用构建说明 设置 用CMake构 ...

  3. 第三章 UT单元测试——CPU与内存使用率限制

    系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 第三章 UT单元测试--CPU与内存使用率限制 文章目录 系列文章目录 前言 一.环 ...

  4. 新手学测试----Unit Test(单元测试)

    在程序员做项目的过程中,每当完成一个功能,首先自己需要对完成的功能进行测试,我现在正在做的项目用的工具是VS2012,那么接下来,就说一说在VS2012中是如何创建单元测试的. 如何创建单元测试? 在 ...

  5. UT单元测试(一)——基础流程总结篇

    参考书籍<单元测试的艺术> 一.单元测试的定义 一个单元测试是一段代码(通常是一个方法),这段代码调用另一段代码(一个单元可以是一个方法或函数),然后检验某些假设的正确性.如果这些假设是正 ...

  6. 写算子单元测试Writing Unit Tests

    写算子单元测试Writing Unit Tests! 一些单元测试示例,可在tests/python/relay/test_op_level3.py中找到,用于累积总和与乘积算子. 梯度算子 梯度算子 ...

  7. 合格的后端Coder都应该写好UT和Mock测试

    作者 | S.L 来源 | http://r6d.cn/aaTem 关于测试 1 测试都包括哪些 广义的测试包括 UT.IT.压力测试.硬件测试等等,这里重点讨论 Unit Test 即单元测试. 2 ...

  8. 软件开发中的完整测试所包括的环节UT、IT、ST、UAT

    软件开发中的完成测试环境所包括的环节包括:UT.IT.ST.UAT UT = Unit Test 单元测试 IT = System Integration Test 集成测试ST = System T ...

  9. golang 单元测试和性能测试

    单元测试 单元测试(Unit Tests, UT) 是一个优秀项目不可或缺的一部分,特别是在一些频繁变动和多人合作开发的项目中尤为重要.你或多或少都会有因为自己的提交,导致应用挂掉或服务宕机的经历.比 ...

  10. UT、IT、ST、UAT

    软件开发中的完成测试环境所包括的环节包括:UT.IT.ST.UAT UT = Unit Test 单元测试 IT = System Integration Test 集成测试 ST = System ...

最新文章

  1. 第六十二课、单例类模板
  2. 拼多多创始人黄峥,要彻底卸下担子,搞“科研”去了。
  3. Cloud Test 单页面即时监测功能上线!
  4. #pragma once与#ifndef的区别?
  5. 没有眼睛的街头卖艺人
  6. nodejs之处理GET请求
  7. Webmin是目前功能最强大的基于Web的Unix系统管理工具
  8. jsp-解决自写Servlet老是报错404
  9. 明天支付宝就开始提现收费了!这几招可以让你受用
  10. python基础--字符串
  11. 大数据导论答案_2020年智慧树APP大数据导论第一单元章节测试网课答案大学课后答案...
  12. mysql 分组求和_MySQL 分组最值、分组均值、分组求和
  13. windows无法格式化u盘_台电u盘无法格式化怎么办 台电u盘无法格式化解决办法【介绍】...
  14. 群晖系统安装相关文件分享
  15. 入门爬虫二三记(一):爬取酷狗音乐榜单Top500
  16. 安卓+七牛云的第三方图片存储实践
  17. 《紫川》之帝都风云 第三卷
  18. 「面试必背」Redis面试题(2022最新版)
  19. jdk的环境配置..
  20. 【Unity游戏开发】静态、动态合批与GPU Instancing

热门文章

  1. C#中服务器端以太网通讯(一对一)
  2. 5、中小企业网络架构-核心层交换机基本配置
  3. C++调用matlab dll报错:Invalid input:Null runtime instance
  4. dicom 的mm换算成像素Pixel
  5. 穆迪分析专家贡献IFRS 9和CECL新书
  6. Learning Atom 学习Atom编辑器 Lynda课程中文字幕
  7. Pandas入门篇:Pandas基础
  8. 谷歌11亿美元买台企手机团队 对硬件有长远计划
  9. HCIP之MPLS中的LDP协议
  10. 谷歌剧变:李飞飞李佳离职后,现在轮到云CEO出局