Spring Boot整合JUnit

引言

测试是软件开发过程中不可或缺的一环,而JUnit作为Java生态中最流行的测试框架之一,与Spring Boot的整合为开发者提供了一套强大的测试工具。本文将讨论Spring Boot整合JUnit的技术细节、最佳实践以及测试驱动开发(TDD)的优雅实践,以帮助开发者充分利用这一强大组合,提高代码质量与可维护性。

Spring整合JUnit的制作方式

java 复制代码
//加载spring整合junit专用的类运行器
@RunWith(SpringJUnit4ClassRunner.class)
//指定对应的配置信息
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTestCase {
    //注入你要测试的对象
    @Autowired
    private UserService userService;
    @Test
    public void testGetById(){
        //执行要测试的对象对应的方法
        System.out.println(userService.findById(1));
    }
}

第一个注解@RunWith是设置Spring专用的测试类运行器,简单说就是Spring程序执行程序有自己的一套独立的运行程序的方式,不能使用JUnit提供的类运行方式了,必须指定一下,但是格式是固定的,琢磨一下,每次都指定一样的东西,这个东西写起来没有技术含量啊

第二个注解@ContextConfiguration是用来设置Spring核心配置文件或配置类的,简单说就是加载Spring的环境你要告诉Spring具体的环境配置是在哪里写的,虽然每次加载的文件都有可能不同,但是仔细想想,如果文件名是固定的,这个貌似也是一个固定格式。既然有可能是固定格式,那就有可能每次都写一样的东西,也是一个没有技术含量的内容书写

主要: SpringBoot抓住上述两点内容书写进行开发简化

Spring Boot与JUnit整合

  1. 依赖配置
    在pom.xml中添加JUnit和Spring Boot Test的依赖:
xml 复制代码
<dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
      </dependency>
</dependencies>
  1. 测试类
java 复制代码
@SpringBootTest
class UserTest {
    @Autowired
    private UserController userController;
    @Test
    public void testJunit(){
        System.out.println(userController);
    }
}

注意: 测试类所在的包需要和启动类是在同一个包下。否则就要使用如下写法指定启动类。

方式一

使用属性的形式进行,在注解@SpringBootTest中添加classes属性指定配置类

java 复制代码
@SpringBootTest(classes = UserApplication.class)
class UserTest {
    @Autowired
    private UserController userController;
    @Test
    public void testJunit(){
        System.out.println(userController);
    }
}

方式二

回归原始配置方式,仍然使用@ContextConfiguration注解进行,效果是一样的

java 复制代码
@SpringBootTest
@ContextConfiguration(classes = UserApplication.class)
class UserTest {
    @Autowired
    private UserController userController;
    @Test
    public void testJunit(){
        System.out.println(userController);
       
    }
}

兼容老版本

如果是对老项目中的SpringBoot进行了版本升级会发现之前的单元测试代码出现了一些问题。

因为Junit5和之前的Junit4有比较大的不同。

从上图可以看出 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

  • JUnit Platform: 这是Junit提供的平台功能模块,通过它,其它的测试引擎也可以接入
  • JUnit JUpiter: 这是JUnit5的核心,是一个基于JUnit
    Platform的引擎实现,它包含许多丰富的新特性来使得自动化测试更加方便和强大。
  • JUnit Vintage: 这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在JUnit5下正常运行。

虽然Junit5包含了JUnit Vintage 来兼容JUnit3和Junit4,但是 SpringBoot 2.4 以上版本对应的spring-boot-starter-test移除了默认对 Vintage 的依赖。 所以当我们仅仅依赖spring-boot-starter-test时会发现之前我们使用的@Test注解和@RunWith注解都不能使用了。

xml 复制代码
<dependency>
	<groupId>org.junit.vintage</groupId>
	<artifactId>junit-vintage-engine</artifactId>
	<scope>test</scope>
</dependency>

注意:

org.junit.Test对应的是Junit4的版本,就搭配@RunWith注解来使用。

java 复制代码
@SpringBootTest
@RunWith(SpringRunner.class)
class UserTest {
    @Autowired
    private UserController userController;
    @Test
    public void testJunit(){
        System.out.println(userController);

    }
}

结语

Spring Boot与JUnit的整合为测试提供了便捷且强大的工具,通过理解Spring Boot与JUnit的整合细节,开发者可以更加自信地构建出稳健、高效的应用程序。在项目的生命周期中,充分发挥测试的作用,将使得代码更加健壮、可测试和易于维护。

相关推荐
Rust研习社17 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒18 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro19 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax19 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH19 小时前
Koa和Express的区别
后端
MariaH19 小时前
Koa框架的使用
后端
luckdewei20 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某1 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy1 天前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom1 天前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github