• 【快学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等),本文都没有涉及,有兴趣的可以了解下。

  • 相关阅读:
    SpringBoot2.0 整合 QuartJob ,实现定时器实时管理
    SpringBoot2.0 整合 Swagger2 ,构建接口管理界面
    SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表
    基于 CODING 轻松搞定持续集成
    CODING 受邀参与 DevOps 标准体系之系统和工具&技术运营标准技术专家研讨会
    CODING 受邀参加《腾讯全球数字生态大会》
    CODING 告诉你硅谷的研发项目管理之道系列(6)
    CODING 告诉你硅谷的研发项目管理之道(3)
    CODING 告诉你硅谷项目经理的项目管理之道(2)
    CODING 签约天津大学,助力高校“产学”接轨
  • 原文地址:https://www.cnblogs.com/happy4java/p/11205891.html
Copyright © 2020-2023  润新知