SpringBoot与mockito那点事
题目起的很像那么回事,但是这篇博客本身写的很简单。
我不想写说一堆概念,然后阐释各种概念是什么意思。我喜欢的是直接从例子出发。
package com.example.demo.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.Person;
import com.example.demo.mapper.PersonMapper;
import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Random;@RequestMapping({"/user"})
@RestController
@Slf4j
public class UserController {@AutowiredPersonMapper personMapper;@RequestMapping("/getUserById")public Person getUserById(Long id){Person person =personMapper.selectById(id);if ("张三".equals(person.getName())){return person;}if ("李四".equals(person.getName())){person.setAge(17);return person;}return person;}
}具体的PersonMapper如下package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.Person;
import org.springframework.stereotype.Component;@Component(value = "personMapper")
public interface PersonMapper extends BaseMapper<Person> {}
首先就是上面的例子,getUserById。
这个方法里面的逻辑可以分为两部分,一个是通过mapper从db里面拿数据,还有就是很多额外完全没有逻辑的代码,不用管它的具体语义,反正就是写些业务逻辑。
我现在想测试的目的就是先假定mapper本身是OK的,然后验证那些无意义的额外逻辑也是正确的。
ok,看测试代码。
package com.example.demo.controller;import com.example.demo.entity.Person;
import com.example.demo.mapper.PersonMapper;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;import static org.mockito.Mockito.when;@SpringBootTest
@ExtendWith(MockitoExtension.class)
public class MockitoTest {@InjectMocksprivate UserController userController;@Mockprivate PersonMapper personMapper;@Testpublic void testGet(){Person person = new Person();person.setName("张三");Long id = 15L;when(personMapper.selectById(id)).thenReturn(person);Person result = userController.getUserById(id);Assertions.assertEquals(person,result);}
}
运行之后:
那pom文件呢?
我用的是
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.5</version><relativePath/> <!-- lookup parent from repository --></parent>
...<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
没有别的依赖了。
ok,测试代码已经能跑了,现在就来解释代码。
代码解释
@InjectMocks
这个注解就是说我要测试被这个注解标注的类,他里面每个方法都会真正的被执行。
换句话说,被这个注解标注的类,是我们真正想测试的类。
InjectMocks 被这个注解标注的类,是我们真正想测试的类。
InjectMocks 被这个注解标注的类,是我们真正想测试的类。
InjectMocks 被这个注解标注的类,是我们真正想测试的类。@Mock
被这个注解标注的是我们想忽略的或者说,默认就认为是ok的类。when
personMapper本身就被@Mock标注了,那么其实里面的每个方法都不会真正的被执行,在UserController的Person person =personMapper.selectById(id);里面selectById就直接返回一个null。
但是加上下面的代码
when(personMapper.selectById(id)).thenReturn(person);
功能我就不解释了。
SpringBoot与mockito那点事相关推荐
- java -jar命令引导启动Springboot项目的那点事
前言:Java官方规定java -jar命令引导的具体启动类必须配置在MANIFEST.MF资源的Main-Class属性中.比如通过java -jar XXX.jar来运行应用时,如不做特殊设置就要 ...
- Mockito详细教程
前言 单元测试(UT) 工作一段时间后,才真正意识到代码质量的重要性.虽然囫囵吞枣式地开发,表面上看来速度很快,但是给后续的维护与拓展制造了很多隐患. 作为一个想专业但还不专业的程序员,通过构建覆盖率 ...
- Mockito的@Mock与@MockBean
在上文的 https://blog.csdn.net/dlf123321/article/details/127930378 里 大家初步会用mockito了 但是马上出现了一个问题. package ...
- SpringBoot底层原理,看完我发现我怀疑人生了
SpringBoot 是目前很流行的一个脚手架,从名字上可以看出是基于Spring框架做了一些封装.相信大家应该都能说出几点使用它的理由也知道它的一些特性或者一些优点,但是它底层是如何支撑这些特性的呢 ...
- Spring Boot 学习(1)
文 by / 林本托 Tip 做一个终身学习的人. 代码地址: https://github.com/iqcz/Springbootdemo Spring Boot 初体验 Spring Boot 包 ...
- MySQL_12_ShardingJDBC实现读写分离与分布式事务
文章目录 一.前言 二.Sharding-JDBC读写分离 2.1 读写分离 2.2 读写分离实践 2.2.1 master节点配置 2.2.2 slave节点配置 2.3 将不同请求路由到不同数据库 ...
- SpringBoot Test及注解详解(含Mockito)
一.版本差异 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,在 Spring Boot 2.2.0 版本之前,spring-boot-starter-test ...
- mockito mock void方法_用过举手!SpringBoot 单元测试利器Mockito
Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean.模拟方法的返回值.模拟抛出异常...等,在了解 Mockito 的具 ...
- spring boot 事务_Redis 事务在 SpringBoot 中的应用
环境信息 JDK 版本信息 <properties><java.version>1.8</java.version> </properties> Spr ...
最新文章
- 解决 王爽写的汇编语言的第七个验七- 寻址方式在结构化数据访问中的应用
- 大一java实训报告1500字_从800字小作文,到3000字小论文你用了多久? | 校媒FM
- 行业洞察驱动安全防御严峻安全挑战迎刃而解
- 堆排序原理及其实现(C++)
- Java命令行界面(第7部分):JCommander
- win8.1 linux系统,电脑显示win8.1linux系统失效的原因及解决办法!
- 路飞学城-Python爬虫集训-第一章
- ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查
- 【领域综述】NLP领域,你推荐哪些综述性的文章?
- 小米12s 12sU 12sP 12x 12pro天玑版等小米机型通用解锁bl 刷写root全部步骤教程
- 做片子留着备用 超级游戏影视配乐音效库36套合集
- 2019最新超详细HUSTOJ在线判题系统及Virtual Judge的搭建
- 【实验操作】计算机网络cisco思科仿真实验操作汇总
- java天猫精灵_教你玩转天猫精灵:把设备接入天猫精灵
- 定点补码加减法运算_定点加减法运算与溢出判断处理
- UESTC 男神的礼物
- b250支持服务器cpu,b250m主板上什么cpu
- 【kubernetes/k8s源码分析】calico node felix源码分析之一
- Tic-Tac-Toe:基于Minimax算法的人机对弈程序(python实现)
- 项目管理心得体会(一)