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 单元测试笔记的更多相关文章

  1. Spring Boot学习笔记2——基本使用之最佳实践[z]

    前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...

  2. Spring Boot单元测试(Mock)

    Spring Boot单元测试(Mock) Java个人学习心得 2017-08-12 16:07 Mock 单元测试的重要性就不多说了,我这边的工程一般都是Spring Boot+Mybatis(详 ...

  3. Spring Boot 单元测试示例

    Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启 ...

  4. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  5. Spring Boot学习笔记(一)----概要与入门

    本文来自博客园,作者:{张果},转载请注明原文链接:{SpringBoot学习笔记(一)--SpringBoot概要与快速入门} 一.Spring Boot概要 没有Spring Boot开发项目时各 ...

  6. Spring Boot 单元测试详解+实战教程

    Spring Boot 的测试类库 Spring Boot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下两个模块. spring-boot-test:支持测试的核心内容. spring-b ...

  7. Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用[z]

    前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...

  8. spring boot 单元测试,如何使用profile

    一.问题概述 spring boot项目.单元测试的时候,我发现,总是会使用application.properties的内容,而该文件里,一般是我的开发时候的配置. 比如上图中,dev是开发配置,p ...

  9. Java程序员的日常—— Spring Boot单元测试

    关于Spring boot 之前没有用Spring的时候是用的MockMvc,做接口层的测试,原理上就是加载applicationContext.xml文件,然后模拟启动各种mybatis\连接池等等 ...

  10. Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用

    前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...

随机推荐

  1. 洛谷 P9916 「RiOI-03」Just a Q. (Easy ver.) 题解

    前言 Div.2 Rank \(13\) 获奖了,题目也好评. 解法 题目链接:\(\color{Purple}\texttt{P9916「RiOI-03」Just a Q. (Easy ver.)} ...

  2. Vue之将前端的筛选结果导出为csv文件

    有导入就有导出哈!这里继导入之后记录一下导出的实现过程. 1.按钮部分: <el-button class="filter-item" style="margin- ...

  3. 【RTOS】基于RTOS的降低功耗的策略

    RTOS中降低功耗的策略 Saving Power with an RTOS 介绍 随着绿色节能产品需求的增加,快速增长的移动设备,其电池寿命最受关注,设计者必须要考虑在其设计中如何最大限度的降低功耗 ...

  4. Python Code_04InputFunction

    代码部分 # coding:utf-8 # author : 写bug的盼盼 # development time : 2021/8/28 6:55 present = input('你想要什么?') ...

  5. [转帖]Prometheus 监控之 Blackbox_exporter黑盒监测 [icmp、tcp、http(get\post)、dns、ssl证书过期时间]

    Blackbox_exporter 主动监测主机与服务状态 Prometheus 官方提供的 exporter 之一,可以提供 http.dns.tcp.icmp 的监控数据采集 官方github: ...

  6. [转帖]Oracle 创建和查看DBLink 的方法

    https://www.cnblogs.com/zhouzangood/articles/4612441.html 1.如果需要创建全局 DBLink,则需要先确定用户有创建 dblink 的权限: ...

  7. [转帖]《Linux性能优化实战》笔记(六)—— Linux 软中断与对应故障分析方法

    中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求. 一. 为什么要有中断 举个生活中的例子,让你感受一下中断的魅力.比如说你订了一份 ...

  8. [转帖]TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践

    返回全部 边城元元案例实践2022-08-02 复杂业务查询对于传统的关系型数据库来说是一种考验,而通过 TiKV 行存与 TiFlash 的列存结合使用就能很好地应对.本文根据 TUG 用户边城元元 ...

  9. 【转帖】bpftrace 指南

    文章目录 0. bpftrace 0.1 bpftrace组件 0.2 bpftrace 帮助信息 0.3 bpftrace 工具速览表 0.4 bpftrace 探针 0.4.1 tracepoin ...

  10. [转帖]linux 查看CPU 内存的信息

    https://bbs.huaweicloud.com/blogs/302929   [摘要] ECS信息规格:2vCPUs | 4GiB | kc1.large.2镜像:openEuler 20.0 ...