为什么会有这篇blog呢,起因上周末看了一个朋友的代码。

结果随便打开他们的测试用例,看一下,这是嘛?

周末补了一下这块的空缺,学无止尽嘛:大致看了一下主体还是很简单的,

官网地址:https://site.mockito.org/

GitHub地址:https://github.com/hehonghui/mockito-doc-zh#0

文档地址:https://javadoc.io/static/org.mockito/mockito-core/3.3.3/org/mockito/Mockito.html

目录

springboot快速搭建一个web项目,用作编写测试用例代码

测试用例 - mockmvc

测试用例 - Mockito


springboot快速搭建一个web项目,用作编写测试用例代码

pom.xml(基于boot2.x,已经内置junit5跟mock了)

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

花几分钟写一个添加用户的功能,DB操作就直接写伪sql了,为啥?因为我懒...

controller

package com.mock.demo.controller;import com.mock.demo.entry.User;
import com.mock.demo.service.SmsService;
import com.mock.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;
import static com.mock.demo.service.impl.UserServiceImpl.userMap;/*** @author 954L* @create 2020/3/24 20:44*/
@RestController
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate SmsService smsService;@PostMapping("user")public Map<String, Object> addAndSendSms(@RequestBody User user,@RequestParam(value = "sendSmsType", defaultValue = "0")Integer sendSmsType) {Map<String, Object> result = new HashMap<>();String name = user.getName();// 发送注册短信boolean status = sendSmsType.equals(1) ? smsService.sendSms() : true;// 查重 & 添加if (status) status = userMap.get(name) != null ?false : userService.add(user);result.put("status", status);return result;}@DeleteMapping("user/{name}")public Map<String, Object> del(@PathVariable("name") String name){Map<String, Object> result = new HashMap<>();// 先添加,再删除userService.add(User.builder().name(name).build());boolean status = userService.del(name) ;result.put("status", status);return result;}}

service

package com.mock.demo.service;import com.mock.demo.entry.User;/*** @author 954L* @create 2020/3/24 20:47*/
public interface UserService {boolean add(User user);boolean del(String name);}
package com.mock.demo.service;/*** @author 954L* @create 2020/3/24 20:39*/
public interface SmsService {boolean sendSms();}

impl

package com.mock.demo.service.impl;import com.mock.demo.entry.User;
import com.mock.demo.service.UserService;
import org.springframework.stereotype.Service;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @author 954L* @create 2020/3/24 20:47*/
@Service
public class UserServiceImpl implements UserService {public static Map<String, User> userMap = new ConcurrentHashMap();@Overridepublic boolean add(User user) {// 添加用户userMap.put(user.getName(), user);return userMap.containsKey(user.getName());}@Overridepublic boolean del(String name) {userMap.remove(name);return !userMap.containsKey(name);}}
package com.mock.demo.service.impl;import com.mock.demo.service.SmsService;
import org.springframework.stereotype.Service;/*** @author 954L* @create 2020/3/24 20:39*/
@Service
public class SmsServiceImpl implements SmsService {/*** 提供给mockito测试模拟对象,返回true* @return*/public boolean sendSms(){// 无短信功能return false;}}

entity(代码包名写错了,将就下)

package com.mock.demo.entry;import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;/*** @author 954L* @create 2020/3/24 20:46*/
@Data
@Builder
public class User {private String name;private Integer age;@Toleratepublic User(){}}

测试用例 - mockmvc

mockmvc

模拟web程序发送一个请求

方法 说明
mockMvc.perform 执行一个请求
MockMvcRequestBuilders.get("XXX") 构造一个请求
ResultActions.param 添加请求传值
ResultActions.accept()) 执行一个请求 如MediaType.TEXT_HTML_VALUE
ResultActions.andExpect 添加执行完成后的断言。 等同于 Assert.assertEquals
ResultActions.andDo 添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息
ResultActions.andReturn 表示执行完成后返回相应的结果。

controllerMockMvcTest

package com.mock.demo.controller;import com.mock.demo.MockApplication;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;/*** @author 954L* @create 2020/3/24 20:03*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MockApplication.class)
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
class UserControllerMockMvcTest {@Autowiredprivate MockMvc mockMvc;@Testvoid add() throws Exception {JSONObject paramJson = new JSONObject();paramJson.put("name", "Tony");paramJson.put("age", "18");mockMvc.perform(MockMvcRequestBuilders.post("/user").contentType(MediaType.APPLICATION_JSON_UTF8).content(paramJson.toString()).accept(MediaType.ALL)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print());}@Testvoid del() throws Exception {mockMvc.perform(MockMvcRequestBuilders.delete("/user/Tony").contentType(MediaType.APPLICATION_JSON_UTF8).accept(MediaType.ALL)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print());}}

测试用例 - Mockito

mockito

模拟外部依赖,将模拟产生的外部依赖数据与测试代码一起执行

方法 说明
Mockito.mock(classToMock) 模拟对象
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

controllerMockItoTest

package com.mock.demo.controller;import com.mock.demo.MockApplication;
import com.mock.demo.entry.User;
import com.mock.demo.service.SmsService;
import com.mock.demo.service.UserService;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.junit4.SpringRunner;import static com.mock.demo.service.impl.UserServiceImpl.userMap;/*** @author 954L* @create 2020/3/24 20:03*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MockApplication.class)
@ExtendWith(SpringExtension.class)
class UserControllerMockItoTest {@Autowiredprivate UserService userService;@Testvoid add() {// 测试添加用户service层,因为依赖短信功能,故这里模拟短信service功能SmsService smsService = Mockito.mock(SmsService.class);// 当执行smsService.sendSms(),模拟返回trueMockito.when(smsService.sendSms()).thenReturn(true);User user = User.builder().name("testName").age(20).build();String name = user.getName();// 发送注册短信boolean status = smsService.sendSms();// 查重 & 添加if (status) status = userMap.get(name) != null ?false : userService.add(user);Assert.assertTrue(status);}}

对你有帮助的话,右上角给个赞呗~

单元测试利器 - Mock相关推荐

  1. 单元测试利器——手把手教你使用Mockito

    作者:京东零售 秦浩然 从你成为开发人员的那一天起,写单元测试终究是你逃不开的宿命!那开发人员为什么不喜欢写单元测试呢?究其原因,无外乎是依赖.依赖其他的服务.依赖运行的环境.等等,各种依赖都成为了我 ...

  2. React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers)

    转载 React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers) 项目初始化[这里使用之前的项目,节省时间] 项目初始化地址 ...

  3. Java单元测试(Junit+Mock+代码覆盖率)

    单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进 ...

  4. 单元测试与 Mock 方法

    Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开. 编写自定义的 Mock 对象需要额外的编码工作,同时也可能 ...

  5. PHP单元测试利器:PHPUNIT初探

    你是否在程序开发的过程中遇到以下的情况:当你花了很长的时间开发一个应用后,你认为应该是大功告成了,可惜在调试的时候,老是不断的发现bug,而且最可怕的是,这些bug是重复出现的,你可能发现这些bug之 ...

  6. 使用 @MockBean 和 @SpyBean 解决 SpringBoot 单元测试中 Mock 类装配的问题

    最近在做某个项目的时候一直使用 @MockBean 来解决单元测试中 Mock 类装配到被测试类的问题.这篇文章主要介绍了 @MockBean 的使用例子以及不使用 @MockBean 而使用@Spy ...

  7. mockito mock void方法_用过举手!SpringBoot 单元测试利器Mockito

    Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean.模拟方法的返回值.模拟抛出异常...等,在了解 Mockito 的具 ...

  8. 单元测试 | 如何Mock IHttpClientFactory

    前言 编写单元测试时,常常需要使用Mock框架(例如Moq)生成测试类的依赖接口的"模拟"实现,并验证接口是否按预期使用: _mediatorMock = new Mock< ...

  9. (二)单元测试利器 JUnit 4

    JUnit 深入         当然,JUnit 提供的功能决不仅仅如此简单,在接下来的内容中,我们会看到 JUnit 中很多有用的特性,掌握它们对您灵活的编写单元测试代码非常有帮助. Fixtur ...

  10. python单元测试mock_python3的单元测试模块mock与性能测试模块cProfile

    我们知道写完了代码需要自己跑一跑进行测试,一个写好的程序如果连测试都没有就上到生产环境是不敢想象的,这么做的人不是太自信就是太无知. 传统测试无非就是自己运行一下程序查看结果,或者前后端服务进行联调, ...

最新文章

  1. 批量下载文献中的参考文献
  2. Mysql CPU占用高的问题解决方法小结
  3. python3 转换json数据的单引号双引号注意点
  4. python项目开发实战网盘-《Python项目案例开发从入门到实战》PDF版百度网盘
  5. 两个整数相加减是否溢出
  6. C++ leetcode 26. 删除排序数组中的重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
  7. idea实现抽象类的所有抽象方法_深入理解Java的接口和抽象类
  8. dynamodb容器使用_使用DynamoDB映射器将DynamoDB项目映射到对象
  9. python 千位分隔符_玩转千位分隔符输出 - leejun2005的个人页面 - OSCHINA - 中文开源技术交流社区...
  10. Android 获取地理位置信息 封装好了 直接用
  11. Linux命令(1)—— xargs 命令
  12. iOS web 、原生 js 交互:方法及原理
  13. 在线选课网站用什么服务器,高校网上选课系统 PC服务器替代小型机
  14. laravel 配置邮件发件人_Jenkins中配置自动化测试项目
  15. 【系统分析师之路】 第八章 复盘软件测试与维护(软件维护)
  16. Android NDK开发(一)环境搭建及运行示例
  17. 服务实例是否宕机的后台检查线程任务
  18. linux下的蓝牙驱动程序详解
  19. DSP-28027笔记
  20. IE8打开网页慢速度优化

热门文章

  1. 学生信息表 成绩表+12章练习
  2. 如何更改oracle_sid,Oracle SID修改方式的详解
  3. php ipa 版本定制,自建IOS企业包ipa包 下载服务
  4. win 10系统语言栏不见了怎么办?
  5. matlab kmeans 质心,KMeans_SPD_Matrices
  6. oracle查询倒叙,ORACLE 索引结构--倒叙索引:
  7. linux文件授权用户创建
  8. 苹果计算机如何显示错误,科普电脑打开苹果手机视频教程及Apple ID验证失败发生未知错误怎么解决...
  9. C#实现手机发送验证码
  10. 移动硬盘显示无法访问数据错误循环冗余检查的文件寻回办法