java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题

往期文章

「Java并发编程」谈谈Java中的内存模型JMM

面试官:说说你知道多少种线程池拒绝策略

为什么不要在MySQL中使用UTF-8编码方式

前言

很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码。写单元测试,也是保证代码质量的一种方式。

junit单元测试

相信绝大多数的Java开发者都用过Junit来写单元测试。

引入依赖:

junit junit 4.12

直接在方法上加上@Test注解即可:

202fe3ec7066411798d86cb8c0c90ec1

加了@Test注解,就会有一个运行的图标了。

spring的依赖问题

现在的Java开发,基本上离不开spring了。但是使用spring,写单测的时候就会存在一个依赖注入的问题。

假设有如下一个Service:

@Servicepublic class TestService {​ public String getString() { return "Hello World!"; }​}

在Junit中直接自动装配:

public class JunitTest {​ @Autowired private TestService testService;​ @Test public void test() { System.out.println(testService.getString()); }​}

运行报错:

e0ad66b2f21d41d1a548960734ad384b

springboot写单元测试

在springboot中,解决spring依赖问题,非常的简单。只需要它提供的几个注解即可:

引入依赖:

org.springframework.boot spring-boot-starter-test test

这里引入了一个spring-boot-starter-test依赖,是springboot中写单测所需要的。

在单元测试类上添加@RunWith(SpringRunner.class)、@SpringBootTest注解:

23e02a1a38a44759802f383d237305a3

这时候就可以正常的把spring依赖注入进来了,运行方法,可以看到springboot启动时的输出:

6294bc4e3ccf4af3bc549d0db7ad5643

如果是通过spring initialize创建的springboot项目(本系列第一篇文章有讲解),其实会自动创建一个单元测试类:

93ed49b866164aae8e6829bbab159347

我们在写单元测试的时候,直接继承这个类即可。

单元测试事务回滚

写单元测试,难免需要操作数据库。有时候单元测试的数据库跟开发时候的数据库是同一个,为了不影响数据库的数据,需要在单测完成之后,将操作回滚。这在springboot中也是很容易解决的事情,只需要将单测类继承AbstractTransactionalJUnit4SpringContextTests即可

数据库有数据如下:

bb1b302552bc4328a08c7d1dbda09cd8

单元测试类如下:

c715d64d40774c49be28326e43d6dcbd

测试方法如下:

@Testpublic void deleteAll() { userRepo.deleteAll();}

执行方法后,如果事务不会滚,则会清除user表中的所有数据。

79ad4bc7fc3546149e86cd7afaa5152e

通过结果查看,单测运行没有问题,查看数据库:

4a0383c3543246d59e637b5c955315b8

数据也没有被删除,证明事务已经回滚了。

把继承的AbstractTransactionalJUnit4SpringContextTests类去掉,再次执行deleteAll方法:

7b2d6adeb27b40439cedcb9670ab519a

数据库中的数据已被删除

总结

本文介绍了springboot中写单元测试的方法。其实优雅的写单元测试需要涉及到很多东西,比如mock(mockito、mockmvc等),本文都没有涉及,有兴趣的可以了解下。

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

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

相关文章

java编译_解析 Java 即时编译器原理。

↑ 点击上面 “时代Java”关注我们,关注新技术,学习新知识!一、导读常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成…

ios nsstring根据ascii码大小排序_iOS(NSPredicate) 谓词的使用

参考iOS-谓词的使用详解NSPredicate 谓词NSPredicateA definition of logical conditions used to constrain a search either for a fetch or for in-memory filtering.一种逻辑条件的定义,可以根据定义的模糊查询条件,对内存对象进行过滤搜索。1.比较运…

恒位油杯故障原因_抽油烟机常见故障及处理方法

您知道抽油烟机常见故障及处理方法是什么吗?抽油烟机通电后不能启动,可能是因为电源线断路或接头脱焊,仔细查出断路点或脱焊点,重新焊牢。通断开关断路或触点接触不良,检查断路器处是否焊好,若触点接触不良…

会议容易中吗_在装配式建筑中重要又容易被忽视的部分,你中招了吗?

装配式 建筑装配式建筑大家应该都有听过,那么这种建筑又是怎样构成的呢?装配式建筑概览▲▲▲装配式建筑粘结方案▲▲▲密封胶作为装配式建筑中的重要材料,起到不可忽视的作用~SMP密封胶,1978年开始生产,最初是针对硅酮…

Document image dewarping using text-lines and line Segments学习笔记

1 核心思想 论文:Robust Document Image Dewarping Method Using Text-Lines and Line Segments 论文:Document Dewarping via Text-line based Optimization 代码:https://github.com/taeho-kil/Document-Image-Dewarping 传统的基于文本行的文档去扭曲方法在处理复杂布局…

官网mysql安装目录_官网下载MySQL 并安装

官网下载MySQL 并安装一、下载二、安装:这里不再叙述安装步骤三、MySQL环境变量配置不是必须的。MySQL环境变量作用:找到MySQL安装目录下的bin目录,才能使用MySQL相关命令。配置环境变量后就不必找到bin目录了。说到这里解释一下Java &#x…

ai二维码插件_送你60款AI脚本插件包,已整合成插件面板的形式,方便在AI中调用...

送你60款AI脚本插件包,已整合成插件面板的形式,方便在AI中调用。(领取方式见文章末尾)【AI脚本插件合集包】此AI插件包目前有66款ai脚本插件,已经整合成插件面板的形式,方便在AI中调用。软件内置刀模线绘制、二维码生成、条码制作…

ai圆角插件_【干货满满】AI软件技巧排版所需

今天给大家来一期关于AI软件的技巧,在画图的速度上能有所提升。下面是软件技巧。#1、在ai中,如何让文件背景是透明的?答:ctrl shift d2、在ai中,如何像快速放大缩小编辑区域?答:按住alt滚动鼠标…

字体垂直居中_海报设计技巧!垂直轴式

文/杨启梅 垂直轴式海报是比较常见的一种海报版式,该版式具有稳重、平和的特点,但是若不注重图文设计的技巧,则容易让该类版式海报落入呆板的窠臼。该文从垂直轴在版面中的位置、文字的易读性和美观性、抽象元素的添加三个方面,讲…

mysql cmd 实时监控_MySQL实时监控工具orztop的使用介绍

前言orztop是一款实时show full processlist的工具,我们可以实时看到数据库有哪些线程,执行哪些语句等。工具使用方便简单。解决了我们需要手动刷新show full processlist的痛苦。该工具为朱旭开发的一款可以查看mysql数据库实时运行的sql状况的工具&…

yii2 mysql update_yii2 + mysql 常用增删改查操作语法以及事务

关于数据库mysql的使用: 1.查询: Salesorderitem::find()-asArray()-where([order_id$order_id])-all();Salesorderitem::find()-asArray()-where([order_id$order_id])-one();Quote::findOne([customer_id $customer_id]); 2.插…

mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...

一、MYSQL数据库设计规范1、数据库命名规范a、采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’_组成;b、命名简洁明确(长度不能超过30个字符);c、例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀;d、除非是备份数…

python添加环境变量_windows系统下python学习-1 (python环境变量配置)

python安装完成后检测一下是否添加了环境变量(基于你已经完成了python的安装)使用 WindowsR 键调出运行窗口,输入 cmd 按回车调出命令提示符窗口,输入 python 回车已添加环境变量如果你回车后出现上图效果,可以进入python编程界面…

c 子类对象 访问父类对象受保护成员_java面向对象总结

前言:文章参考《java疯狂讲义》进行总结和归纳,知识要进行输出才算真正的有用。在java的世界里,一切皆为对象,类是对对象的抽象,来一个例子:Person类public 有了类,就可以创建者个类的对象了&am…

多次执行sql 后卡住_解Bug之路记一次中间件导致的慢SQL排查过程

解Bug之路-记一次中间件导致的慢SQL排查过程前言最近发现线上出现一个奇葩的问题,这问题让笔者定位了好长时间,期间排查问题的过程还是挺有意思的,就以此为素材写出了本篇文章。Bug现场我们的分库分表中间件在经过一年的沉淀之后,…

c++思维导图_40+张最全Linux/C/C++思维导图,你确定不收藏?

ID:技术让梦想更伟大整理:李肖遥申明:所有图片都源自网络素材,侵删。这是我自己收集的,并花大量时间整理的可说最全的Linux/C/C思维导图。有些图可能不是高清,但是放大即可看清楚。linux思维导图认识LinuxLinux学习路径…

fortran安装_如何在 CentOS 8 上安装 GCC

本文最先发布在:如何在 CentOS 8 上安装 GCC​www.itcoder.techGNU 编译器集合是一系列用于语言开发的编译器和库的集合,包括: C, C, Objective-C, Fortran, Ada, Go, and D等编程语言。很多开源项目,包括 Linux kernel 和 GNU 工具&#xff…

seata 如何开启tcc事物_分布式事务Seata-TCC源码分析

为了更好理解分布式事务,首先提出一个问题:假设数据库中有两个表ta,tb,我们要分别更改ta表中的ra记录和tb表中的rb记录,但要求ra和rb记录都修改成功,才认为此次操作时成功,或者需要失败回滚。针…

promise的三种状态_一.Promise中核心逻辑的实现

首先看一下Promise代码:let promise new Promise((resolve,reject)>{resolve(成功);//reject(失败); }) promise.then(val>{console.log(val); },reason>{console.log(reason); })我们根据以上的一个简单的用例,得到Promise类的最主要的核心逻辑…

mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?

概述如果是Oracle数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句,而mysql数据库可以怎么定位呢?这里用一个简单例子说明下...主要是了解如何定位的思路,具体看官网介绍..参考:https://www.percona.com/blog…