• Spring Boot单元测试


    目录

    1.概述

    2.基本使用

    3.优势

    4.常用属性


    1.概述

    所谓单元测试就是对功能最小粒度的测试,落实到JAVA中就是对单个方法的测试。对单个方法的测试用junit即可,关于junit作者另一位篇文章中有详细介绍,感兴趣的小伙伴可以去看看:

    junit可以完成单个方法的测试,但是对于Spring体系下的web应用的单元测试是无能为力的。因为spring体系下的web应用都采用了MVC三层架构,依托于IOC,层级之间采用了依赖注入的方式来进行调用。如果应用不启动、IOC容器不进行初始化、依赖没有被注入进IOC容器,根本就没办法正常的使用。调controller,会由于service没注入而报空指针异常,调service,会由于dao没注入而报空指针异常。

    所以我们发现想要对Spring Boot进行单元测试,前置条件就是需要启动应用,或者说准确点是需要启动IOC。但很明显我们又不可能每次都去直接启动应用来进行测试,一些架构糟糕、很重的老应用启动,动不动就是几分钟甚至十几分钟。我们不可能每次写一点新的代码,想要测试就去重启一下,这样效率太低了。

    为此spring boot test为我们提供了@SpringBootTest来对SpringBoot应用进行快捷的单元测试。

    2.基本使用

    一般单元测试类我们都放在test路径下,一个@Test就是一个case(用例):

    在从 Spring Boot 1.4.0 版本以前@SpringBootTest需要和@RunWith配合来使用

    @RunWith(SpringRunner.class)用来指定启动类是哪个?@SpringBootTest用来加载应用上下文

    依赖:

            org.springframework.boot

            spring-boot-starter-test

            test

    代码示例:

    1. import org.junit.runner.RunWith;
    2. import org.springframework.boot.test.context.SpringBootTest;
    3. import org.springframework.test.context.junit4.SpringRunner;
    4. @RunWith(SpringRunner.class)
    5. @SpringBootTest
    6. public class MyApplicationTests {
    7. // 测试内容
    8. }

    在从 Spring Boot 1.4.0 版本开始就不用加上@RunWith了,直接使用@SpringBootTest就可以了。

    代码示例:

    1. import org.springframework.boot.test.context.SpringBootTest;
    2. import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
    3. import com.example.MyApplication; // 替换成实际的主启动类所在的包
    4. @SpringBootTest(classes = MyApplication.class)
    5. public class MyApplicationTests {
    6. // 测试内容
    7. }

    3.优势

    我猜到这儿很多小伙伴有所疑惑:

    既然@SpringBootTest也要启动主启动类,那和我们直接启动SpringBoot应用来测试有什么区别喃?@SpringBootTest的优势在哪儿?

    答案是——轻量级:

    @SpringBootTest 注解提供了轻量级的测试环境,相比直接启动整个应用程序,它可以只加载所需的配置和组件,从而使测试更加迅速。这对于单元测试是非常有利的,因为它们通常关注的是某个组件或模块的功能,而不是整个应用程序。

    4.常用属性

    @SpringBootTest 注解提供了许多属性,用于配置测试的上下文加载和应用程序启动。以下是一些常用的 @SpringBootTest 属性:

    classes:

    指定启动测试时加载的配置类或主启动类。可以使用其中一个属性,根据需要选择。

    webEnvironment:

    指定测试的 Web 环境。可以设置为 WebEnvironment.MOCK(默认值,使用 MockMvc)或 WebEnvironment.RANDOM_PORT(随机端口,真正启动嵌入式容器)等。

    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    

    WebEnvironment.MOCK:

    在这种模式下,不会启动真正的嵌入式 Web 服务器,而是使用 MockMvc 框架模拟 HTTP 请求和响应。这样可以在没有真实服务器的情况下测试控制器的行为。适用于测试控制器层的逻辑,但不需要测试整个 Web 应用程序的场景。

    WebEnvironment.RANDOM_PORT:

    在这种模式下,会启动嵌入式 Web 服务器,并使用一个随机的端口。这允许测试整个应用程序的集成,包括 HTTP 请求和响应。适用于测试整个应用程序的场景,但不会影响外部系统。

    WebEnvironment.DEFINED_PORT:

    RANDOM_PORT 类似,但是在这种模式下,使用的端口是固定的,可以在属性中配置。这适用于需要预定义端口的场景,例如与外部系统集成时。

    WebEnvironment.NONE:

    在这种模式下,不会启动任何嵌入式 Web 服务器,也不会模拟 HTTP 请求和响应。这种模式适用于单元测试,主要测试业务逻辑,而不涉及与 Web 环境的交互。

    properties:

    指定配置属性。

    @SpringBootTest(properties = "my.property=value")
    

    exclude:

    指定要排除的配置类。

    @SpringBootTest(exclude = {SomeConfiguration.class, AnotherConfiguration.class})
    

  • 相关阅读:
    Python毕业设计-基于Python Django的旅游城市关键词提取和分析,附可视化界面
    Linux中vim查看文件某内容
    儿童玩具和儿童用品美国CPC认证ASTM测试CPSIA标准大合集
    .NET 9 预览版 5 发布
    多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布
    Java异常
    【PID优化】基于matlab simulink正余弦算法PID优化设计【含Matlab源码 2233期】
    AlterNats是如何做到高性能的发布订阅的?
    playwright的安装与使用
    第五节 C++ 循环结构(算法)
  • 原文地址:https://blog.csdn.net/Joker_ZJN/article/details/134542387