单元测试编写最佳实践(ChatGPT+Mockito+JUnit)

背景

基于 springboot 微服务架构给单元测试带来的问题:

  1. springboot 单元测试启动家长过程非常缓慢,后期服务启动达到分钟级,非常影响效率
  2. 服务之间相互依赖非常严重,单元测试的运行非常依赖其它服务稳定性
  3. 第三方服务和中间件,测试过程产生大量垃圾数据,污染环境,非常笨重,甚至产生资损。

解决办法

采用 EasyMock, PowerMock,Mockito 等mock 框架, 屏蔽外部依赖,还原单元测试本身。

Mockito使用

由于spring-boot-starter-test 默认集成了 Mockito的依赖,本文优先介绍 Mockito框架的使用。

依赖

一般不需要手动指定

        <dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.3.3</version></dependency>

导入

导入常用静态方法

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

模拟对象

Mock 对象的创建

语法: mock(class or interface)

用例:

OrderService orderService = mock(OrderService.class);

设置预期返回值

语法: when(mock.someMethod()).thenReturn(value)

用例:

when(productService.getById(1L)).thenReturn(new Product(1L,"mate50", new BigDecimal("9000")));

验证被测试类方法

语法: verify(mock).someMethod(…),verify(mock,times(integer)).someMethod(…)

用例:

verify(orderMapper).insert(any(Order.class));
verify(stockService, times(2)).deduct(anyLong(), eq(1));

配合注解使用

语法: @Mock, mock 一个对象

语法: @InjectMocks , 依赖注入 mock对象

用例:

    /*** orderMapper, stockService等为 OrderServiceImpl的依赖对象.*/@InjectMocksprivate OrderService orderService = new OrderServiceImpl(); @Mockprivate OrderMapper orderMapper;@Mockprivate StockService stockService;@Mockprivate AmountService amountService;@Mockprivate ProductService productService;

完整案列

    @Testpublic void testSubmitOrder() {Long userId = 1L;List<Product> productList = Lists.newArrayList(new Product(1L, 1),new Product(2L, 1));// 模拟productService.getById方法,返回一个Product对象when(productService.getById(1L)).thenReturn(new Product(1L,"mate50", new BigDecimal("9000")));when(productService.getById(2L)).thenReturn(new Product(2L,"充电宝", new BigDecimal("120")));boolean result = orderService.submitOrder(userId, productList);// submitOrder 验证返回结果为trueassertTrue(result);// 验证stockService.deduct方法被调用了2次verify(stockService, times(2)).deduct(anyLong(), eq(1));// 验证orderMapper.insert方法被调用了1次verify(orderMapper, times(1)).insert(any(Order.class));}

使用codeGPT 生成单元测试

prompt: Write JUnit Tests for the following code by using java, use mockito, use Chinese comment:

完整代码

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.*;@RunWith(MockitoJUnitRunner.class)
public class OrderServiceTest {@Mockprivate ProductService productService;@Mockprivate StockService stockService;@Mockprivate OrderMapper orderMapper;@InjectMocksprivate OrderService orderService;@Testpublic void testSubmitOrder() {// givenList<Product> products = Arrays.asList(new Product(1L, "product1", BigDecimal.valueOf(10), 2),new Product(2L, "product2", BigDecimal.valueOf(20), 1));when(productService.getById(1L)).thenReturn(new Product(1L, "product1", BigDecimal.valueOf(10), 10));when(productService.getById(2L)).thenReturn(new Product(2L, "product2", BigDecimal.valueOf(20), 10));// whenboolean result = orderService.submitOrder(123L, products);// thenassertEquals(true, result);verify(productService, times(2)).getById(anyLong());verify(stockService, times(3)).deduct(anyLong(), anyInt());verify(orderMapper).insert(any(Order.class));}
}

结论:通过观察,gpt 生成的单元测试跟手动写的单元测试非常相近,几乎直接可以使用。



一点心得

不要去纠结GPT 哪方面做的不好,要多思考,利用GPT能为我们做什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18733.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一种基于GOP改进的口语语音评测算法

最近在看语音评测的算法&#xff0c;看到2019年INTERSPEECH 2019 的的一篇paper。这篇主要是研究了 HMM transition probabilities对语音评测的影响。 测试后发现还是比原来的GOP语音评测算法有所改善。

微信版大语言模型来了:跨时空对话李白、教你高情商说话,API在线试玩全都有...

鱼羊 梦晨 发自 凹非寺量子位 | 公众号 QbitAI 大规模语言模型&#xff0c;微信版&#xff0c;来了&#xff01; 并且甫一登场&#xff0c;就没藏着掖着&#xff1a; 论文、API接口、在线试玩网站……一条龙全都齐备。 续写文本、阅读理解等常规任务就不说了&#xff0c;这个名…

元语AI(ChatYuan): ChatGPT中文版尝试?功能型对话大语言模型.beta版

元语AI是什么 我们训练了一个叫做元语AI&#xff08;ChatYuan&#xff09;的模型&#xff0c;它可以通过对话形式进行交互。它可以回答问题&#xff0c;具有联系上下文的能力&#xff1b;可以写文章、写作业、写诗歌、做中英文间的翻译&#xff1b;一些法律等特定领域问题也可以…

李宏毅HW01——新冠疫情数据的预测

目的&#xff1a;熟悉熟悉pytorch 导入数据 !gdown --id 1kLSW_-cW2Huj7bh84YTdimGBOJaODiOS --output covid.train.csv !gdown --id 1iiI5qROrAhZn-o4FPqsE97bMzDEFvIdg --output covid.test.csv/Users/missbei/miniforge3/envs/NLP_search/lib/python3.8/site-packages/gdo…

基于Spark对美国新冠肺炎疫情数据进行分析

2020年美国新冠肺炎疫情数据分析 基于Spark对美国新冠肺炎疫情数据进行分析一、实验环境二、数据集加载三、使用Spark对数据进行分析四、数据可视化 基于Spark对美国新冠肺炎疫情数据进行分析 此案例以2020年美国新冠肺炎疫情数据作为数据集&#xff0c;以Python为编程语言&am…

Chinese medical dialogue data 中文医疗对话数据集

Chinese medical dialogue data 中文医疗对话数据集 Data_数据中有6个文件夹分别是: <Andriatria_男科> 94596个问答对 <IM_内科> 220606个问答对 <OAGD_妇产科> 183751个问答对 <Oncology_肿瘤科> 75553个问答对 <Pediatric_儿科> 101602个问答…

Python爬取新冠肺炎实时数据及其可视化分析

点赞、关注再看&#xff0c;养成良好习惯 Life is short, U need Python 初学Python&#xff0c;快来点我吧 案例&#xff1a;Python爬取新冠肺炎实时数据及其可视化分析 作者&#xff1a;PyQuant 博客&#xff1a;https://blog.csdn.net/qq_33499889 慕课&#xff1a;https:…

北大研究团队面向新冠疫情的数据可视化分析与模拟预测

本次pythonday开发者日活动有幸请到北京大学的陈宝权教授做分享&#xff0c;以下是陈教授近期进行的面向新冠疫情的数据可视化分析与模拟预测项目&#xff0c;陈教授将会在本次活动上做分享与答疑&#xff0c;欢迎大家参与&#xff01; 指导教师&#xff1a;陈宝权教授&#xf…

利用Python获取新冠状病毒肺炎的疫情数据并进行可视化分析,看不懂你打我

文章目录 数据挖掘案例&#xff1a;利用Python获取新冠状病毒肺炎的疫情数据并进行可视化分析一、疫情数据报告网站地址1.1 pyecharts介绍1.2 要用到的库1.3 爬取数据1.3.1 方法11.3.2 方法2&#xff08;采用&#xff09;1.地址2.自己来获取试试看 二、爬取的数据初查看三、爬取…

大数据实战 --- 世界新冠疫情数据分析

目录 开发环境 数据描述 功能需求 数据准备 统计计算 Hbase Hive 分析数据 开发环境 HadoopHiveSparkHBase 启动Hadoop&#xff1a;start-all.sh 启动zookeeper&#xff1a;zkServer.sh start 启动Hive&#xff1a; nohup hiveserver2 1>/dev/null 2>&1 &…

【Python】2020年美国新冠肺炎疫情数据分析

2020年美国新冠肺炎疫情数据分析 一、 需求描述二、 环境介绍三、 数据来源描述四、 数据上传及上传结果查看五、数据处理过程描述1、数据集下载2、格式转换3、启动Hadoop集群4、将文件上传至HDFS文件系统中5、使用Spark对数据进行分析6、读取文件生成DataFrame8、数据可视化 六…

数据分享|函数型数据分析部分省市新冠疫情数据

作者&#xff1a;Mingji Tang 统计学中传统的数据类型有截面数据和时间序列数据。这两者都只能在某一纵向或横向上探究数据&#xff0c;且部分前提条件又很难满足。而函数型数据连续型函数与离散型函数长期以来的分离状态&#xff0c;实现了离散和连续的过度。它很少依赖于模型…

利用Python爬取新冠肺炎疫情实时数据,Pyecharts画2019-nCoV疫情地图

前言 博客是2年前写的&#xff0c;中间有好多网友私信我获取源码及指出部分bug&#xff0c;感谢支持&#xff01; 取不到数据的原因是数据接口发生较大变化&#xff0c;最近刚好有时间&#xff0c;所以重新整理了一下。 第一部分 网页分析 数据源 腾讯疫情实时追踪 今天重新整…

新冠肺炎国内外疫情数据爬取

环境说明 爬虫环境&#xff1a; Python3 IDE:Pycharm 爬虫工具包&#xff1a; requests BeautifulSoup json 从腾讯新闻网爬取 使用chrome浏览器对腾讯新闻网进行页面元素审查&#xff0c;进入network&#xff0c;刷新&#xff0c;查看response&#xff1a; 寻找到这三个js文…

[Pyhon疫情大数据分析] 四.微博话题抓取及新冠肺炎疫情文本挖掘和情感分析

思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警及AI和NLP应用等。希望该系列线上远程教学对您有所帮助,也希望早点战胜病毒,武汉…

爬取WHO各国病例数据

还在为拿不到官方病例数据而发愁吗&#xff1f; WHO各国病例数据如下&#xff1a; https://experience.arcgis.com/experience/685d0ace521648f8a5beeeee1b9125cd 我们的目的就是爬出这个图中的数据&#xff1a; 审查元素 首先我们随便点开一个国家的疫情情况&#xff1a;…

Python数据分析高薪实战第十天 EDA实战-全球新冠肺炎确诊病例趋势分析

27 初识 EDA&#xff1a;全球新冠肺炎确诊病例趋势分析 从本讲开始&#xff0c;我们会通过四个具体的案例来将我们之前学习的 Python 数据分析方面的知识全都串起来。一方面能够融会贯通&#xff0c;另一方面也能帮你掌握数据分析基本的方法论。 本讲我们首先会介绍数据分析中…

【大数据基础】2020年美国新冠肺炎疫情数据分析

https://dblab.xmu.edu.cn/blog/2738 https://dblab.xmu.edu.cn/blog/2636/ spark 安装 安装 Spark2.4.0 sudo tar -zxf ~/下载/spark-2.4.0-bin-without-hadoop.tgz -C /usr/local/ cd /usr/local sudo mv ./spark-2.4.0-bin-without-hadoop/ ./spark sudo chown -R hadoop:…

新冠疫情分析(疫情数据爬取+数据分析+网页排版展示)

新冠疫情来临&#xff0c;我简单的做一次疫情的数据分析温习我的python知识&#xff0c;也希望能帮到各位。分析中我用到的技术有&#xff1a;pyton爬取数据htmlcss将分析结果排版。用到的工具有exceltableau进行数据处理分析和绘图。数据分析中还是存在很多的不足&#xff0c;…

基于Python语言的Spark数据处理分析——2020年美国新冠肺炎疫情数据分析

基于Python语言的Spark数据处理分析——2020年美国新冠肺炎疫情数据分析 一、实验环境二、数据集1.数据集下载来源2.转换文件格式3.上传文件至HDFS文件系统 三、使用Spark进行数据分析1.读取文件并生成DataFrame2.采用python编程语言进行数据分析3.将HDFS上结果文件保存到本地文…