往期文章

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

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

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

前言

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

junit单元测试

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

引入依赖:

junit junit 4.12

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

加了@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()); }​}

运行报错:

springboot写单元测试

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

引入依赖:

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

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

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

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

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

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

单元测试事务回滚

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

数据库有数据如下:

单元测试类如下:

测试方法如下:

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

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

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

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

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

数据库中的数据已被删除

总结

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

springboot 事务嵌套问题_在springboot中写单元测试解决依赖注入和执行后事务回滚问题...相关推荐

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

    往期文章 「Java并发编程」谈谈Java中的内存模型JMM 面试官:说说你知道多少种线程池拒绝策略 为什么不要在MySQL中使用UTF-8编码方式 前言 很多公司都有写单元测试的硬性要求,在提交代码 ...

  2. Spring事务捕获异常后依旧回滚

    前沿 一段生产事故发人深省,在Spring的声明式事务中手动捕获异常,居然判定回滚了,这是什么操作?话不多说直接上代码 @Service public class A {@Autowiredpriva ...

  3. MVC3 中使用Unity实现依赖注入

    前言:前段时间一直在研究依赖注入,不过不是在MVC框架中使用,今天突然想到在MVC中使用Unity实现依赖注入,一时慌了,不知道从何下手,接着就是网上不停的找资料,下面我把我找到的资料分享下,也把我的 ...

  4. layui选项卡嵌套选项卡_在ProtoPie中使用嵌套组件构建选项卡栏

    layui选项卡嵌套选项卡 One of the powerful features of ProtoPie is the ability to build fully portable and in ...

  5. 事务嵌套问题_注意Spring事务这一点,避免出现大事务

    背景 本篇文章主要分享压测的(高并发)时候发现的一些问题.之前的两篇文章已经讲述了在高并发的情况下,消息队列和数据库连接池的一些总结和优化,有兴趣的可以在我的公众号中去翻阅.废话不多说,进入正题. 事 ...

  6. mysql 高并发写入锁表_使用mysql中的锁解决高并发问题

    阿里云产品通用代金券,最高可领1888分享一波阿里云红包. 阿里云的购买入口 为什么要加锁 多核计算机的出现,计算机实现真正并行计算,可以在同一时刻,执行多个任务.在多线程编程中,因为线程执行顺序不可 ...

  7. .net 调用url接口_.NetCore中Quartz.NET的依赖注入

    更多精彩,请点击上方蓝字关注我们!关于上位机体验课你有两种选择↓:4月20日-24日晚20:00-21:30 介绍 Quartz.NET是一个方便的库,允许您通过实现IJob接口来安排重复任务.然而, ...

  8. python try catch finally执行顺序_对python中的try、except、finally 执行顺序详解

    如下所示: def test1(): try: print('to do stuff') raise Exception('hehe') print('to return in try') retur ...

  9. Java EE 7中的资源和依赖注入

    1.概述 上下文和依赖注入(CDI)是Java EE的一项功能,可帮助融合Java EE 6和更高版本中包含的平台的Web层和事务层. 从技术角度来看,这意味着CDI提供了依赖项注入框架,并且还管理了 ...

最新文章

  1. 外国人看我国量子计算机祖冲之号,1.2小时完成超算8年!我国“祖冲之号”量子计算机刷新记录...
  2. Leetcode 75. 颜色分类 (每日一题 20210817)
  3. 百练OJ:3681与2796:数字求和
  4. 云耀服务器切换系统,【计算】云耀服务器-常见操作汇总指南
  5. 游戏自审自查报告_开发的射箭小游戏上线了,分享一下我在开发过程中遇到的问题...
  6. 直播不是造车,特斯拉开店玩直播却栽了个“跟头”
  7. Visual Studio 开发环境安装与配置
  8. 水系图一般在哪里找得到_如何对于排水系统的服务范围进行统计分析
  9. shell 脚本获取时间戳
  10. ES(二)| 安装ES、Kibana、IK分词器、拼音分词器(自动补全)
  11. VOIP技术连载之一 VOIP简介
  12. http://www.cnblogs.com/Jackie-zhang/p/6071769.html
  13. 2017年域名从Godaddy转移到Namesilo过程全记录
  14. 报错“The C compiler identification is unknown……”解决办法
  15. 简单排序算法时间空间复杂度分析及应用(7)-希尔排序
  16. tableau-计算一个月内的第几周
  17. NEUQ—ACM实验班2.4小测试反思总结
  18. USB HOST与 USB OTG的区别及工作原理
  19. 如何在 DAX 计算中隐藏未来日期?
  20. 从零学Java(9)之修饰符,小AD竟打起了钱的主意!

热门文章

  1. “数”驰天下,华为云DRS 高效支撑T3出行平稳迁移
  2. 华为超大云数据中心落地贵州,这些硬核技术有利支撑“东数西算”
  3. 被面试官问懵:TCP 四次挥手收到乱序的 FIN 包会如何处理?
  4. 云图说|华为数据安全中心,助你保障云上数据安全!
  5. 我敢说,这个版本的斗地主你肯定没玩过?
  6. 【华为云技术分享】如何设计高质量软件-领域驱动设计DDD(Domain-Driven Design)学习心得
  7. 补习系列(4)-springboot 参数校验详解
  8. 网络协议osi模型_网络协议|OSI模型第二层数据链路层
  9. ZooKeeper的安装和API
  10. R Studio更换外部包镜像的方法