SpringBoot 集成测试主要组件及其特点

news2024/11/23 16:36:15

SpringBoot 集成测试主要组件及其特点

随着SpringBoot的流行,集成测试也变得越来越重要。SpringBoot提供了一些主要组件来支持集成测试,本文将介绍这些组件及其特点。

在这里插入图片描述

1. Spring Test

Spring Test是Spring框架提供的测试工具集,其主要目的是为了简化Spring应用程序的单元测试和集成测试。Spring Test提供了一些注解和类,以便在测试Spring应用程序时使用。

1.1 @SpringBootTest

@SpringBootTest是一个注解,用于指定要测试的SpringBoot应用程序的入口点。使用该注解可以启动整个Spring应用程序上下文,包括所有的bean和配置,并启动嵌入式的servlet容器。可以通过设置webEnvironment属性来指定要使用的servlet容器类型。

1.2 @MockBean

@MockBean注解用于替换Spring应用程序上下文中的bean实例,以便在测试中模拟bean的行为。使用该注解可以将bean替换为Mockito mock对象,从而使测试更加容易。

1.3 @WebMvcTest

@WebMvcTest注解用于测试Spring MVC控制器。使用该注解可以启动一个小型的Spring应用程序上下文,只包含与MVC相关的bean,例如控制器、视图解析器和消息转换器。

1.4 @DataJpaTest

@DataJpaTest注解用于测试Spring Data JPA存储库。使用该注解可以配置一个轻量级的Spring应用程序上下文,只包含与JPA相关的bean,例如实体管理器、数据源和事务管理器。该注解还可以自动配置一个嵌入式内存数据库,用于测试JPA存储库。

2. Spring Boot Test

Spring Boot Test是SpringBoot提供的测试工具集,其目的是为了简化SpringBoot应用程序的单元测试和集成测试。Spring Boot Test提供了一些注解和类,以便在测试SpringBoot应用程序时使用。

2.1 @SpringBootTest

@SpringBootTest在Spring Test中已经介绍过了,这里不再赘述。

2.2 @MockBean

@MockBean在Spring Test中已经介绍过了,这里不再赘述。

2.3 @AutoConfigureMockMvc

@AutoConfigureMockMvc注解用于自动配置MockMvc实例。MockMvc是一个针对Spring MVC应用程序的模拟HTTP请求的测试框架。

2.4 @AutoConfigureTestDatabase

@AutoConfigureTestDatabase注解用于自动配置测试数据库。可以通过设置replace属性来指定要使用的数据库类型。

2.5 @TestPropertySource

@TestPropertySource注解用于指定要在测试中使用的属性源。可以使用该注解指定测试使用的属性文件。

3. Spring Cloud Contract

Spring Cloud Contract是Spring Cloud生态系统中的一个组件,用于支持基于契约的开发。使用Spring Cloud Contract,可以定义和测试契约,以确保服务之间的正确交互。

3.1 Contract Definition

Spring Cloud Contract使用Groovy DSL来定义契约。契约可以定义请求和响应的内容,以及响应的状态码。例如,以下是一个简单的契约定义:

package contracts

org.springframework.cloud.contract.spec.Contract.make {
    description("get user by id")
    request {
        method 'GET'
        url '/users/1'
    }
    response {
        status 200
        body([
            id: 1,
            name: 'John Smith'
        ])
    }
}

3.2 Contract Testing

Spring Cloud Contract提供了一个基于JUnit的测试框架,用于测试契约。测试框架会自动启动一个MockMvc实例,并使用契约定义来生成HTTP请求和响应。然后,测试框架将验证响应是否与契约定义匹配。例如,以下是一个简单的契约测试:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@AutoConfigureStubRunner(ids = "com.example:users-service:+:stubs:8080", stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class UserControllerContractTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldReturnUserById() throws Exception {
        mockMvc.perform(get("/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.id", is(1)))
            .andExpect(jsonPath("$.name", is("John Smith")));
    }
}

在测试中,使用了Spring Boot Test和Spring Cloud Contract的注解来配置测试环境。@AutoConfigureStubRunner注解用于自动配置StubRunner,以便在测试中使用模拟服务。测试方法通过MockMvc执行HTTP请求,并使用jsonPath验证响应是否与契约定义匹配。

4. Testcontainers

Testcontainers是一个Java库,用于管理Docker容器的生命周期。Testcontainers可以在测试中启动和停止Docker容器,以便测试应用程序的不同部分。Testcontainers支持各种类型的容器,例如数据库、消息队列和缓存。

4.1 使用Testcontainers

使用Testcontainers非常简单,只需要在测试类中创建一个容器,并在测试方法中使用该容器即可。例如,以下是一个使用Testcontainers测试MySQL数据库的示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryIntegrationTest {

    @Container
    private static final MySQLContainer<?> mysql = new MySQLContainer<>("mysql:5.7")
        .withDatabaseName("test")
        .withUsername("test")
        .withPassword("test");

    @Autowired
    private UserRepository userRepository;

    @Test
    public void shouldSaveAndRetrieveUser() {
        User user = new User("John Smith");
        userRepository.save(user);
        User retrievedUser = userRepository.findById(user.getId()).orElse(null);
        assertNotNull(retrievedUser);
        assertEquals(user.getName(), retrievedUser.getName());
    }
}

在测试中,使用了Spring Boot Test和JUnit的注解来配置测试环境。@Container注解用于创建一个MySQL容器,并在测试方法中使用该容器进行测试。在测试方法中,使用了userRepository来保存和检索用户,并使用断言验证测试结果。

5. 总结

SpringBoot提供了许多组件来支持集成测试,包括Spring Test、Spring Boot Test、Spring Cloud Contract和Testcontainers。这些组件提供了简单易用的API,可以帮助开发人员编写高质量的集成测试。开发人员可以根据应用程序的需求选择适当的组件,并在测试中使用它们来确保应用程序的正确性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

langchain源码阅读系列(二)之数据接入层

原文首发于博客文章OpenAI 文档解读 LangChain 主体分为 6 个模块&#xff0c;分别是对&#xff08;大语言&#xff09;模型输入输出的管理、外部数据接入、链的概念、&#xff08;上下文记忆&#xff09;存储管理、智能代理以及回调系统&#xff0c;通过文档的组织结构&#x…

将数组中所有元素依次向右或向左移动指定的n个位置 从右侧移出的元素从左侧补入 从左侧移出的元素从右侧补入 numpy.roll()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组中所有元素依次向右 或向左移动指定的n个位置 从右侧移出的元素从左侧补入 从左侧移出的元素从右侧补入 numpy.roll() [太阳]选择题 请问关于以下代码的最后输出正确的是&#xff1f;…

chatgpt赋能python:Python编程:如何赚取高薪?

Python编程&#xff1a;如何赚取高薪&#xff1f; Python语言是一门被广泛使用的编程语言&#xff0c;因其简单易学&#xff0c;而在软件开发、数据分析、机器学习及人工智能等领域中得到了广泛应用。随着这些领域的不断发展&#xff0c;对Python开发人才的需求也越来越高涨。…

基于Java彩妆小样售卖商城的设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Python爬虫之数据解析技术

Python爬虫需要数据解析的原因是&#xff0c;爬取到的网页内容通常是包含大量标签和结构的HTML或XML文档。这些文档中包含所需数据的信息&#xff0c;但是需要通过解析才能提取出来&#xff0c;以便后续的处理和分析。 以下是一些使用数据解析的原因&#xff1a; 数据提取&…

基于Java高校实验室管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

通过Web3Js网页代码在MetaMask辅助下完成用户发送操作

上文 html通过web3JS 获取当前连接的区块链信息和账号信息在html中通过 Web3.0.js 获取了本地虚拟的区块链信息 和通过 公钥获取了账号的 ETH 那么 之前我们文章 Web3通过 MetaMask简单演示对ganache虚拟环境账号进行管理操作演示了通过MetaMask在本地发送ETH给其他账号 那么 …

springboot+vue基于java的健美操体操舞蹈视频评分系统

健美操评分系统采用B/S架构&#xff0c;数据库是MySQL。系统的搭建与开发采用了先进的JAVA进行编写&#xff0c;使用了springboot框架。该系统从三个对象&#xff1a;由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页&#xff0c;个人中心&#xff0c;裁判员管理…

【Linux】遇事不决,可先点灯,LED驱动的进化之路---2

【Linux】遇事不决&#xff0c;可先点灯&#xff0c;LED驱动的进化之路---2 前言&#xff1a; 一、Pinctrl子系统重要概念 1.1 重要概念 1.1.1 pin controller 1.1.2 client device 1.1.3 补充概念 二、GPIO子系统重要概念 2.1 在设备树指定GPIO引脚 2.2 在驱动代码中…

代码质量平台实践-SonarQube

代码质量平台实践-SonarQube 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 本节实战 实战名称&#x1f498; 实践&#xff1a;Scanner进行项目代码扫描(测试成功)-2023.6.24&#x1f498; 实践&#xff1a;Jenkins集成SonarQube(命令行方式)(测…

java8新特性之--函数式接口加方法引用与构造器引用详细讲解

函数式(Functional)接口 什么是函数式(Functional)接口 只包含一个抽象方法的接口&#xff0c;称为函数式接口。 你可以通过 Lambda 表达式来创建该接口的对象。&#xff08;若 Lambda 表达式 抛出一个受检异常(即&#xff1a;非运行时异常)&#xff0c;那么该异常需要在目标…

Java集合容器面试题

集合 什么是集合 集合就是用于存储数据的容器&#xff0c;只能存储引用类型&#xff0c;所以集合非常适合用来存储对象。而且集合是长度可变&#xff0c;所以对象个数不确定的时候适合使用集合 集合的特点 1、集合只能存储引用数据类型。集合用于存储对象。 2、对象的个数…

centos版本的EDA虚拟机搭建3

0、参考博客 1、CentOS 7 下 rar unrar的安装 1、配置虚拟机与主机共享文件夹。 **前提&#xff0c;虚拟机关机。**之后进行虚拟机设置&#xff0c;选项-共享文件夹&#xff0c;点击总是启用&#xff0c;之后添加共享文件夹名称。 之后打开虚拟机&#xff0c;命令行输入v…

【Leetcode60天带刷】day34贪心—— ​860. 柠檬水找零​,406.根据身高重建队列

​ 题目&#xff1a; 860. 柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。…

Python零基础入门(五)——超详细的列表和元组介绍

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键

问题 在 MySQL 中设计表的时候,MySQL 官方推荐不要使用 uuid 或者不连续不重复的雪花 id(long 型且唯一),而是推荐连续自增的主键 id,官方的推荐是 auto_increment,那么为什么不建议采用 uuid,使用 uuid 究竟有什么坏处? MySQL 和程序实例 1、要说明这个问题,我们首先…

开关电源-6中常用的防反接电路

6种常用防反接电路介绍 电源反接&#xff0c;会给电路造成损坏&#xff0c;电源反接是不可避免的。所以我们就需要给电路中加入保护电路&#xff0c;达到即使接反电源&#xff0c;也不会损坏的目的&#xff0c;下面介绍几种常用防反接电路。 一、单二极管防反接电路 二极管防…

RabbitMQ 2023面试5题(一)

一、RabbitMQ延时队列可以用于哪些场景 RabbitMQ延时队列可以用于以下场景&#xff1a; 订单处理&#xff1a;在电商网站中&#xff0c;订单处理是一个常见的业务流程。如果订单需要立即处理&#xff0c;可以使用RabbitMQ的延时队列来实现延迟处理。例如&#xff0c;可以将订单…

SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

文章目录 前后端对接前端接口修改对接后端后端总体配置后端编写登录登出业务代码 测试后端所有代码 前后端对接 前端接口修改对接后端 src\api\user.js中修改请求地址&#xff0c;与后端保持一致 记录下前端的src\utils\request.js中的X-Token字段 改变开发环境中的请求地…

Golang每日一练(leetDay0108) 灯泡开关I\II Bulb Switcher

目录 319. 灯泡开关 Bulb Switcher &#x1f31f;&#x1f31f; 672. 灯泡开关II Bulb Switcher ii &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…