zoukankan      html  css  js  c++  java
  • 【快学springboot】在springboot中写单元测试[Happyjava]

    前言

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

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

  • 相关阅读:
    DB2 for Z/os Statement prepare
    Foreign key (referential) constraints on DB2 LUW v105
    复制Informational constraints on LUW DB2 v105
    DB2 SQL Mixed data in character strings
    DB2 create partitioned table
    MVC中使用EF的技巧集(一)
    Asp.Net MVC 开发技巧(二)
    Linq使用技巧及查询示例(一)
    Asp.Net MVC 开发技巧(一)
    Asp.Net MVC Identity 2.2.1 使用技巧(八)
  • 原文地址:https://www.cnblogs.com/happy4java/p/11206453.html
Copyright © 2011-2022 走看看