专栏首页Happy的分享【快学springboot】在springboot中写单元测试

【快学springboot】在springboot中写单元测试

前言

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

junit单元测试

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

引入依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
复制代码

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

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

spring的依赖问题

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

假设有如下一个Service:

@Service
public 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依赖问题,非常的简单。只需要它提供的几个注解即可:

引入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
复制代码

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

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

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

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

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

单元测试事务回滚

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

数据库有数据如下:

单元测试类如下:

测试方法如下:

@Test
public void deleteAll() {
    userRepo.deleteAll();
}
复制代码

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

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

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

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

数据库中的数据已被删除

总结

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【快学springboot】1.快速创建springboot项目

    IDEA专业版默认集成了此工具,eclipse或者vs code等可以自行搜索安装。如果不希望安装此插件,也可直接通过官网创建spring boot项目,然后下...

    Happyjava
  • 微软的新终端(windows terminal)可以下载啦,赶紧体验一波

    在6月22日,微软公布了Windows Terminal命令行终端工具预览版已经开放下载。这是一个现代化的快速终端应用程序,适用于命令行工具和shell,包括命...

    Happyjava
  • 「快学springboot」16.让swagger帮忙写接口文档

    这段话首先告诉大家Swagger是世界上最流行的API工具,并且Swagger的目的是支撑整个API生命周期的开发,包括设计、文档以及测试和部署。使用swagg...

    Happyjava
  • 商汤科技发布首款 AI 诊疗平台,张少霆深谈其医疗战略

    近日,在2018世界人工智能大会上, 商汤科技副总裁、研究院副院长张少霆发表了重要演讲,并公布商汤首款医疗AI产品——SenseCare智慧诊疗平台。

    AI掘金志
  • 谷歌智能隐形眼镜即将上市 功能非比寻常?

    ---- Google申请了一份有关隐形眼镜的专利,并于上月获批。该隐形眼镜配备动力装置,拥有血糖监测功能。这一专利对于在媒体界享有盛誉但仍开发出许多实际消费...

    机器人网
  • CentOS服务器部署(YUM)

    2) 下载新的CentOS-Base.repo 到/etc/yum.repos.d/

    剑行者
  • 【快学springboot】1.快速创建springboot项目

    IDEA专业版默认集成了此工具,eclipse或者vs code等可以自行搜索安装。如果不希望安装此插件,也可直接通过官网创建spring boot项目,然后下...

    Happyjava
  • 持续集成服务平台 flow.ci 已支持直接构建码云项目

    flow.ci 已正式支持码云!现在可以通过如下操作,直接构建码云上的项目: 1. 进入 flow.ci 首页 ? 2. 登录或注册 ? 3. 点击创建项目 ?...

    码云Gitee
  • leetcode 第45题:跳跃游戏2

    我们的目的是要跳跃到最后一个点上,我们可以从最后一个点往左开始寻找,例如非负数组为 arr = {2,3,1,1,4,2,1},从最右边的 1 往左寻找,找那个...

    帅地
  • 使用opennlp自定义命名实体

    opennlp的自定义命名实体的标注,给以了一定定制空间,方便开发者定制各自领域特殊的命名实体,以提高特定命名实体分词的准确性。

    codecraft

扫码关注云+社区

领取腾讯云代金券