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,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
随机推荐
- 如何实现纯网页语音视频聊天和桌面分享?(附源码,PC版+手机版)
在网页里实现文字聊天是比较容易的,但若要实现视频聊天,就比较麻烦了.本文将实现一个纯网页版的视频聊天和桌面分享的Demo,可直接在浏览器中运行,不需要安装任何插件. 一. 主要功能及支持平台 1.本D ...
- Vue - 组件通信(父子单向传递、父子相互传递、祖孙隔代传递)
父组件向子组件单向传递 父组件:引入子组件后,通过属性绑定的形式,将值传入子组件: ` ` 子组件:子组件通过props接收父组件传入的值; ` {{sonGetParam}} ` 子组件向父组件单向 ...
- 在Chrome中安装扩展程序
场景:在Chrome中安装NetBeans Connector插件,将下载好的crx文件拖到扩展程序页面时,发现该插件并没有安装成功. 分析:浏览器默认禁用了拖入安装 .crx 扩展的功能,导致crx ...
- 软考下午科目——第三章——UML分析与设计
UML分析与设计 大纲要求: 学会面向对象的分析与设计,掌握UML描述方法 UML基础知识 面向对象的分析与设计 面向对象方法是一种运用对象.类.继承.封装.聚合.关联.消息.多态性等概念来构造系统的 ...
- Qt5.9 UI设计(二)——最简Qt工程搭建
前言 前面一章已经介绍了QT的开发环境的安装,这里介绍一下一个最简工程的搭建 操作步骤 新建项目 选择带界面的Qt Widgets Application 设置项目位置 注意这里的目录不能有中文路径 ...
- K8S增加限制后的启动时间验证
K8S增加限制后的启动时间验证 背景 前段时间看了下JVM载linux上面的启动时间, 进行过一些验证. 最近想着能够验证一下K8S上面的启动相关的信息 所以就整理了一下. 虽然没有特别好的结论, 但 ...
- 【转帖】MySQL 8.0.32如期而至
MySQL 8.0版本计划 MySQL 8.0开始采用快速迭代开发模式,基本上是每隔3个月就发布一个新的小版本.去年1月18日(2022.1.18)发布MySQL 8.0.28,今年1月17日发布My ...
- [转帖]【dperf系列-5】使用dperf进行性能测试(初级)
https://zhuanlan.zhihu.com/p/451341132 dperf是一款高性能的开源网络压力测试仪,是Linux基金会旗下的DPDK官方生态项目.本文介绍如利用dperf在两台物 ...
- [转帖]ls命令
ls(list) 命令可以说是Linux下最常用的命令之一 #ls -l;列出文件的详细信息 #ll 以上两个命令一样,ll是ls -l的简写 #ls -al;列出目录下的所有文件,包括以 . 开头的 ...
- [转帖]龙芯 vs 飞腾:各种测试数据看国产CPU水平
https://zhuanlan.zhihu.com/p/99921594 2019年年末,龙芯.飞腾两大国产CPU巨头更是相继组织了规模宏大的年会,发布了新型桌面芯片及其整机产品,顿时硝烟四起.各大 ...