美文网首页springbootSpring Boot全家桶
Spring Boot之junit单元测试踩坑

Spring Boot之junit单元测试踩坑

作者: 狄仁杰666 | 来源:发表于2020-07-24 15:48 被阅读0次

    前言

    本文使用的项目代码,是基于之前文章使用的Spring Boot项目:

    单元测试步骤

    1. 添加依赖
    2. 创建单元测试类
    3. 编写单元测试类
    4. 运行单元测试
    5. 踩坑

    1. 添加依赖;

    //在pom.xml文件中的dependencies节点内添加以下内容即可:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    

    2. 创建单元测试类;

    单元测试类
    package com.mycompany.sample;
    
    /**
     * @author : dylanz
     * @since : 07/24/2020
     **/
    public class LeadServiceTest {
    }
    

    3. 编写单元测试类;

    package com.mycompany.sample;
    
    import com.mycompany.sample.domain.Lead;
    import com.mycompany.sample.service.LeadService;
    import org.junit.*;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    /**
     * @author : dylanz
     * @since : 07/24/2020
     **/
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class LeadServiceTest {
        @Autowired
        private LeadService leadService;
    
        @BeforeClass
        public static void beforeClassTest() {
            System.out.println("This is beforeClassTest");
            System.out.println("-----------------------");
        }
    
        @Before
        public void beforeTest() {
            System.out.println("This is beforeTest");
            System.out.println("-----------------------");
        }
    
        @Test
        public void getLeadByLeadIdTest() {
            Long leadId = 10130546L;
            Lead lead = leadService.getLeadByLeadId(leadId);
    
            //为了验证leadService.getLeadByLeadId()是否被调用成功,我们把结果打印出来:
            System.out.println("leadId:" + lead.leadId);
            System.out.println("email:" + lead.email);
    
            Assert.assertEquals(leadId, lead.leadId);
            Assert.assertNotNull(lead.email);
        }
    
        @After
        public void afterTest() {
            System.out.println("This is afterTest");
            System.out.println("-----------------------");
        }
    
        @AfterClass
        public static void afterClassTest() {
            System.out.println("This is afterClassTest");
            System.out.println("-----------------------");
        }
    }
    

    关于测试类,主要关注以下几点:

    1. 在测试类中,应使用对应注解:@RunWith(SpringRunner.class)和@SpringBootTest;
    2. BeforeClass和AfterClass方法必须为static类型;
    3. BeforeClass比Before运行早,AfterClass比After运行晚,整体顺序为:

    BeforeClass >>> Before >>> Test >>> After >>> AfterClass

    4. 运行单元测试;

    运行单元测试 运行结果

    5. 踩坑;

    至此,我们已经能够在Spring Boot框架下开始使用junit进行基本的单元测试,但故事往往没有这么单纯顺利,其实在运行的初期,我遇到了一个问题:

    在运行单元测试时,控制台有报错,错误如下:

    报错1

    经过一番搜索查阅,网上资料说是框架中自动使用了junit5,需要更改pom.xml, 忽略5.x的junit相关jar(因为我使用的是junit 4.1.3):


    5.x junit jar

    于是在spring-boot-starter-test依赖内忽略他们,如:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    

    修改完成后,再次运行,结果又换了个报错:


    报错2

    又一脸蒙,我怀疑是不是没忽略所有5.x,验证后也不是这个问题。几经搜索后发现,竟然有可能跟IntelliJ的版本有关系,并且该报错中也确实有提到IntelliJ,升级完IntelliJ,再次运行单元测试,才最终工作正常。并且移除pom.xml中忽略的junit 5.x相关包配置,重新加载5.x的包之后,运行单元测试,工作也仍正常,因此根本原因是:

    IntelliJ版本问题

    (真是万万没想到啊!)

    出错的版本:2016.3.4的社区版

    升级后的版本:2019.1的社区版

    仅以此文入手Spring Boot单元测试,并记录实现过程中遇到的奇葩问题!

    更多单元测试相关的知识未来继续学习!!!

    相关文章

      网友评论

        本文标题:Spring Boot之junit单元测试踩坑

        本文链接:https://www.haomeiwen.com/subject/jkvjlktx.html