Spring Boot 单元测试笔记
1. 导入JUnit5测试框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.7.2</version>
<scope>test</scope>
</dependency>
其他按 Spring Boot 项目标准,按需引入即可
2. 编写Service
/**
* 假设一个订单类
*/
public class DemoOrder {
private String orderId;
private String orderUser;
private String contents;
private Integer quantity;
private BigDecimal price;
private BigDecimal total;
// getter,setter略
}
Mapper 接口
@Mapper
public interface DemoOrderMapper {
DemoOrder selectOrderByOrderId(String orderId);
List<DemoOrder> selectOrderByOrderParam(OrderParam param);
}
Service
/**
* DemoService
* 此处的两个方法,一个是传入String,一个是传入封装好的参数类 OrderParam。这两种方法的测试方法不同
*/
public interface DemoService {
DemoOrder findOrderByOrderId(String orderId);
DemoOrder findOrderByRequestParam(OrderParam param);
}
@Service
public class DemoServiceImpl implements DemoService {
@Autowired
DemoMapper demoMapper;
@Override
public DemoOrder findOrderByOrderId(String orderId) {
DemoOrder order = demoMapper.selectOrderByOrderId(orderId);
return order;
}
@Override
public DemoOrder findOrderByRequestParam(OrderParam param) {
List<DemoOrder> orderList = demoMapper.selectOrderByRequestParam(param);
return CollectionUtils.isEmpty(orderList) ? null : orderList.get(0);
}
}
3. 编写测试类
@DisplayName("单元测试用例")
public class DemoServiceTest {
@InjectMocks
DemoServiceImpl demoService; // 此处注意要使用Service接口的实现类
@Mock
DemoMapper demoMapper; // 对Mapper使用Mock
@BeforeEach
public void setUp() {
openMocks(this);
// 老版本是 initMocks(this);
// 准备数据
DemoOrder order1 = new DemoOrder();
order1.setOrderId("001");
order1.setOrderUser("User1");
order1.setContents("contents1");
order1.setQuantity(1);
order1.setPrice(new BigDecimal("10.5"));
order1.setTotal(new BigDecimal("10.5"));
DemoOrder order2 = new DemoOrder();
order2.setOrderId("002");
// ... 其他属性略
DemoOrder order3 = new DemoOrder();
order3.setOrderId("003");
// ... 其他属性略
// 以下为mock mapper的方法模拟
// 1. 传String的方法,直接传入模拟的参数即可
when(demoMapper.selectOrderByOrderId("001")).thenReturn(order1);
when(demoMapper.selectOrderByOrderId("002")).thenReturn(order2);
// ...
// 2. 传OrderParam的方法,需要将 when...thenReturn语法改为 doReturn...when... 语法
doReturn(Collections.singletonList(order1))
.when(demoMapper).selectOrderByOrderParam(argThat(
new ArgumentMatcher<OrderParam>() {
@Override
public boolean match(OrderParam param) {
return param.getOrderId().equals("001")
}
}
));
// 此处也可以将 ArgumentMatcher 单独定义
doReturn(Collections.singletonList(order2))
.when(demoMapper).selectOrderByOrderParam(argThat(
new ArgumentMatcher<OrderParam>() {
@Override
public boolean match(OrderParam param) {
return param.getOrderId().equals("002")
}
}
));
}
@Test
public void findOrderByOrderIdTest() {
String orderId = "001";
DemoOrder order = demoService.findOrderByOrderId(orderId);
assertThat(order.getOrderUser()).isEqualTo("User1");
}
@Test
public void findOrderByOrderParamTest() {
OrderParam param = new OrderParam();
param.setOrderId("002");
DemoOrder order = demoService.findOrderByOrderParam(param);
assertThat(order.getOrderUser()).isEqualTo("User2");
}
}
Spring Boot 单元测试笔记的更多相关文章
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...
- Spring Boot单元测试(Mock)
Spring Boot单元测试(Mock) Java个人学习心得 2017-08-12 16:07 Mock 单元测试的重要性就不多说了,我这边的工程一般都是Spring Boot+Mybatis(详 ...
- Spring Boot 单元测试示例
Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启 ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Spring Boot学习笔记(一)----概要与入门
本文来自博客园,作者:{张果},转载请注明原文链接:{SpringBoot学习笔记(一)--SpringBoot概要与快速入门} 一.Spring Boot概要 没有Spring Boot开发项目时各 ...
- Spring Boot 单元测试详解+实战教程
Spring Boot 的测试类库 Spring Boot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下两个模块. spring-boot-test:支持测试的核心内容. spring-b ...
- Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用[z]
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- spring boot 单元测试,如何使用profile
一.问题概述 spring boot项目.单元测试的时候,我发现,总是会使用application.properties的内容,而该文件里,一般是我的开发时候的配置. 比如上图中,dev是开发配置,p ...
- Java程序员的日常—— Spring Boot单元测试
关于Spring boot 之前没有用Spring的时候是用的MockMvc,做接口层的测试,原理上就是加载applicationContext.xml文件,然后模拟启动各种mybatis\连接池等等 ...
- Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
随机推荐
- 5分钟教会你如何在生产环境debug代码
前言 有时出现的线上bug在测试环境死活都不能复现,靠review代码猜测bug出现的原因,然后盲改代码直接在线上测试明显不靠谱.这时我们就需要在生产环境中debug代码,快速找到bug的原因,然后将 ...
- 接口自动化复习第四天利用正则和faker提取替换变量值
在做接口自动化测试的时候,我们经常会遇到,有些字段利用随机生成数据就行了,不需要自己去构造测试数据.今天我就是要python中的第三方库faker来构造随机数,其次使用正则表达式来提取变量. 首先在接 ...
- hdu 5547
***题意:4*4数独,要求在同一行同一列不能有相同的数字,另外在2*2的小单元里也不能有相同的数字 思路:DFS暴力搜索, 每个位置填1-4,递归回溯,判断是否符合条件,递归到最后一个位置+1则输出 ...
- 每天学五分钟 Liunx 111 | 存储篇:NFS
NFS NFS(Network File System,网络文件系统),它可以通过网络让不同操作系统,不同机器共享彼此的文件. NFS 分为服务端和客户端.服务端提供共享的文件目录,客户端将该目录挂载 ...
- kafka 集群环境搭建
本文为博主原创,未经允许不得转载: 如果搭建单机节点 kafka 可看我的这篇博客: 搭建 kafka 集群环境,只需要在搭建单机 kafka 环境的基础上,多增加几个kafka 服务实例即可. 多增 ...
- 在线photoshop网页版工具开发
基于javascript开发的在线ps工具,打包方式webpack 在线预览 在线ps网页版 源码地址 https://github.com/geeeeeeeek 功能介绍 在线图像编辑器允许您使用H ...
- 基于java+springboot的旅游信息网站、旅游景区门票管理系统
该系统是基于java+springboot开发的旅游景区门票管理系统.是给师弟开发的大四实习作品.学习过程中,遇到问题可以咨询github作者. 演示地址 前台地址: http://travel.gi ...
- Makefile中的+=、:=、?=
1.= "="是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用"="进行赋值,变量的值是整个makefile中最后被指定的值.不太容易理解 ...
- [转帖]TiUP 常见运维操作
https://docs.pingcap.com/zh/tidb/stable/maintain-tidb-using-tiup 本文介绍了使用 TiUP 运维 TiDB 集群的常见操作,包括查看集群 ...
- [转帖]如何使用 sed 命令删除文件中的行
https://zhuanlan.zhihu.com/p/80212245 sed 命令是 Linux 中的重要命令之一,在文件处理方面有着重要作用.可用于删除或移动与给定模式匹配的特定行.-- Ma ...