当前位置: 首页 > news >正文

Spring集成Junit

目录

1、简介

2、Junit存在的问题

3、回顾Junit注解

4、集成步骤

4.1、导入坐标

4.2、@Runwith

4.3、@ContextConfiguration

4.4、@Autowired

4.5、@Test

4.6、代码

5、补充说明

5.1、@Runwith

5.2、BlockJUnit4ClassRunner

5.3、没有配置@Runwith


 ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:JavaEE、Spring

1、简介

在 Spring 中集成 JUnit 是一种常见的测试方式,可以使用 JUnit 运行 Spring 容器中的测试用例。这样你可以测试 Spring 容器中的 Bean,进行集成测试,确保你的 Spring 配置和组件能够正确地工作。

2、Junit存在的问题

原始Junit测试Spring的问题:在原来的测试代码中,都要反复编写加载配置文件或者配置类的代码,重复性比较高。两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。

解决思路:

①让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它

②将需要进行测试Bean直接在测试类中进行注入

3、回顾Junit注解

注解

描述

@Test

标记方法为测试方法。

@Before

标记方法在每个测试方法执行前执行。

@After

标记方法在每个测试方法执行后执行。

@BeforeClass

标记静态方法,在所有测试方法执行前执行。

@AfterClass

标记静态方法,在所有测试方法执行后执行。

@Ignore

标记测试方法忽略,不会执行。

@RunWith

指定运行测试用例的运行器(Runner)

@Rule

创建测试规则,可以自定义测试方法的行为。

@Parameterized

创建参数化测试,对每组参数执行测试。

@RunWith(Parameterized.class)

运行参数化测试。

@Test(expected = Exception.class)

指定测试方法期望抛出的异常。

@Test(timeout = 1000)

指定测试方法的最大执行时间。

4、集成步骤

Spring集成Junit步骤:

① 导入spring集成Junit的坐标

② 使用@Runwith注解替换原来的运行期

③ 使用@ContextConfiguration指定配置文件或配置类

④ 使用@Autowired注入需要测试的对象

⑤ 创建测试方法进行测试

4.1、导入坐标

此处需要注意的是,spring5 及以上版本要求 junit 的版本必须是 4.12 及以上

4.2、@Runwith

@RunWith注解是指定运行测试用例的运行器(Runner)

使用@Runwith注解替换原来的运行器:@RunWith(SpringJUnit4ClassRunner.class)

4.3、@ContextConfiguration

使用@ContextConfiguration指定配置文件或配置类

@ContextConfiguration 是 Spring Test 模块中的注解,用于在测试类上指定 Spring 配置文件的位置,从而在测试过程中启动 Spring 容器并进行依赖注入。

在 Spring 的单元测试和集成测试中,我们通常需要配置一个或多个 Spring 配置文件,以便在测试中使用 Spring 的功能。@ContextConfiguration 注解提供了一种简便的方式来指定这些配置文件的位置。

@ContextConfiguration 注解的常用属性:

  1. locations:用于指定 Spring 配置文件的位置,可以是一个或多个配置文件路径,多个路径使用数组形式。例如:@ContextConfiguration(locations = "classpath:applicationContext.xml")@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:spring-beans.xml"})
  2. classes:用于指定 Spring 配置类的类型,可以是一个或多个 Java 配置类。例如:@ContextConfiguration(classes = MyConfig.class)@ContextConfiguration(classes = {MyConfig1.class, MyConfig2.class})
  3. initializers:用于指定 Spring ApplicationContextInitializer 类型的类,可以在 Spring 容器启动前执行自定义初始化操作。
  4. inheritLocations:是否继承父类的配置文件位置,默认为 true。如果设置为 false,则不继承父类的配置。
  5. inheritInitializers:是否继承父类的初始化器,默认为 true。如果设置为 false,则不继承父类的初始化器。

4.4、@Autowired

使用@Autowired注入需要测试的对象

4.5、@Test

4.6、代码

package com.xzl.test;import com.xzl.config.SpringConfiguration;
import com.xzl.dao.UserDao;
import com.xzl.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.sql.DataSource;
import java.sql.SQLException;/*** @author 逐梦苍穹* @date 2023/7/21 23:15*/
@RunWith(SpringJUnit4ClassRunner.class)
//加载spring核心配置文件
//@ContextConfiguration(value = {"classpath:applicationContext.xml"})
//加载spring核心配置类
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {@Autowiredpublic UserDao userDao;@Autowiredpublic UserService userService;@Autowired@Qualifier(value = "dataSource_druid")public DataSource dataSourceDruid;@Autowired@Qualifier(value = "dataSource_c3p0")public DataSource dataSourceC3p0;@Testpublic void test1() throws SQLException {System.out.println(dataSourceDruid.getConnection());System.out.println(dataSourceC3p0.getConnection());}@Testpublic void test2(){userDao.save();userService.save();}
}

5、补充说明

5.1、@Runwith

@RunWith(SpringJUnit4ClassRunner.class) 是 JUnit 中的一个注解,用于指定运行测试用例时使用的运行器(Runner)。在 Spring 集成测试中,我们通常需要启动 Spring 容器,并将测试类中的 Bean 注入到容器中,以便进行真实的集成测试。

使用 @RunWith(SpringJUnit4ClassRunner.class) 注解,我们可以告诉 JUnit 使用 SpringJUnit4ClassRunner 运行器来运行测试类。这个运行器会启动 Spring 容器,并在测试类中注入 Spring 容器中的 Bean。这样,我们就可以在测试方法中调用这些 Bean,进行真实的集成测试。

5.2、BlockJUnit4ClassRunner

BlockJUnit4ClassRunner 是 JUnit 4 框架中的默认测试运行器(Runner)。它是 JUnit 4 的标准运行器,用于执行测试用例并提供了一些测试框架的核心功能。

当我们没有在测试类上使用 @RunWith 注解来指定特定的运行器时,

JUnit 4 就会默认使用BlockJUnit4ClassRunner 来运行测试。

BlockJUnit4ClassRunner 提供了以下主要功能:

  1. 创建测试实例:它负责实例化测试类,并在执行测试方法时创建测试实例。
  2. 执行测试方法:它负责执行标记了 @Test 注解的测试方法,并提供一些测试方法执行的钩子(hook)方法,如 @Before@After
  3. 支持测试规则:JUnit 4 引入了测试规则(@Rule 注解)的概念,用于扩展测试用例的行为。BlockJUnit4ClassRunner 支持 @Rule 注解,并在测试执行期间调用测试规则。
  4. 支持超时测试:可以通过 @Test(timeout) 注解设置测试方法的最大执行时间,如果测试方法在指定时间内没有完成,测试将失败。
  5. 支持测试异常:可以使用 @Test(expected) 注解来指定测试方法期望抛出的异常,如果测试方法没有抛出指定的异常,则测试失败。
  6. 支持参数化测试:虽然 BlockJUnit4ClassRunner 不支持参数化测试,但我们可以使用 @RunWith(Parameterized.class) 来启用参数化测试,它是 JUnit 4 内置的另一个运行器。

总的来说,BlockJUnit4ClassRunner 提供了 JUnit 4 测试框架的基本功能,它是默认的运行器,可以满足大多数简单的单元测试需求。对于更复杂的测试需求,我们可以选择其他适合的运行器,如 SpringJUnit4ClassRunner 用于 Spring 集成测试,或者使用 Parameterized 运行器进行参数化测试。

5.3、没有配置@Runwith

JUnit 将会使用默认的运行器 BlockJUnit4ClassRunner 来运行测试用例。这个运行器不会启动 Spring 容器,也不会处理任何 Spring 相关的注解。

在没有配置 @RunWith(SpringJUnit4ClassRunner.class) 的情况下,测试用例将按照普通的 JUnit 测试方式执行。这意味着测试方法将独立运行,不会进行 Spring 的集成测试。

例如,假设有以下的测试类:

import org.junit.Test;public class MyTest {@Testpublic void test1() {System.out.println("Test 1 is executed.");}@Testpublic void test2() {System.out.println("Test 2 is executed.");}
}

如果没有配置 @RunWith(SpringJUnit4ClassRunner.class),则测试方法 test1()test2() 将按照普通的 JUnit 测试方式运行。在运行测试时,控制台将输出:

因为没有配置 @RunWith(SpringJUnit4ClassRunner.class),所以 Spring 相关的注解如 @Autowired@ContextConfiguration 等都不会生效。测试用例也不会与 Spring 容器进行集成,无法注入 Spring 容器中的 Bean。

因此,如果需要进行 Spring 集成测试并使用 Spring 相关的注解,就需要在测试类上配置 @RunWith(SpringJUnit4ClassRunner.class),以启动 Spring 容器并进行集成测试。

相关文章:

Spring集成Junit

目录 1、简介 2、Junit存在的问题 3、回顾Junit注解 4、集成步骤 4.1、导入坐标 4.2、Runwith 4.3、ContextConfiguration 4.4、Autowired 4.5、Test 4.6、代码 5、补充说明 5.1、Runwith 5.2、BlockJUnit4ClassRunner 5.3、没有配置Runwith ⭐作者介绍&#xff1…...

Java正则校验密码至少包含:字母数字特殊符号中的2种

一、语法 字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ ,\\( 匹配 (。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n…...

Stable Diffusion教程(6) - 扩展安装

打开stable diffusion webUI界面 加载插件列表 依次点击扩展->可用->加载自 搜索插件 首先在搜索框输入你要安装的插件,然后点击插件后面的安装按钮 如果你需要的插件这里面没有找到,可通过通网址安装的方式安装。 在git仓库网址输入框输入的你插件…...

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址:https://learn.microsoft.com/zh-cn/windows-server/administration/op…...

字母异位词分组 LeetCode热题100

题目 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路 将字符串按字符升序排列后作为key,原字符串作为value存储到map上。 代码 class Solution…...

使用angular和electron 构建桌面应用

使用angular和electron 构建桌面应用 初始设置 新建一个angular app npm install -g @angular/cli ng new angular-electron cd angular-electron修改src/index.html文件内容 将绝对路径改为相对路径,加个点,使electron可以访问到angular文件资源 <base href=".…...

安达发制造工业迈向智能化:APS高级计划排程助力提升生产效率

随着市场竞争的加剧&#xff0c;制造企业纷纷寻求提高生产效率和降低成本的方法。近年来&#xff0c;越来越多的制造企业开始采用APS(高级计划与排程)系统&#xff0c;以优化生产计划和排程&#xff0c;提高生产效率&#xff0c;并在竞争中取得优势。 现代制造业通常面临复杂的…...

Flink - sink算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. Kafka_Sink 2. Kafka_Sink - 自定义序列化器 3. Redis_Sink_String 4. Redis_Sink_list 5. Redis_Sink_set 6. Redis_Sink_hash 7. 有界流数据写入到ES 8. 无界流数据写入到ES 9. 自定…...

【项目 线程2】3.5 线程的分离 3.6线程取消 3.7线程属性

3.5 线程的分离 #include <stdio.h> #include <pthread.h> #include <string.h> #include <unistd.h>void * callback(void * arg) {printf("chid thread id : %ld\n", pthread_self());return NULL; }int main() {// 创建一个子线程pthread…...

Filebeat+ELK 部署

目录 //在 Node1 节点上操作 1&#xff0e;安装 Filebeat 2&#xff0e;设置 filebeat 的主配置文件 3&#xff0e;在 Logstash 组件所在节点上新建一个 Logstash 配置文件 4&#xff0e;浏览器访问 http://192.168.193.40:5601 登录 Kibana&#xff0c;单击“Create In…...

el-table点击表格某一行添加到URL参数,访问带参URL加载表格内容并滚动到选中行位置 [Vue3] [Element-plus 2.3]

写在最前 需求&#xff1a;有个表格列出了一些行数据&#xff0c;每个行数据点击后会加载出对应的详细数据&#xff0c;想要在点击了某一行后&#xff0c;能够将该点击反应到URL中&#xff0c;这样我复制这个URL发给其他人&#xff0c;他们打开时也能看到同样的行数据。 url会根…...

【树】 二叉树 堆与堆排序 平衡(AVL)树 红黑(RB)树

目录 1 树1.1 认识树1.2 树的相关概念1.3 树的表示孩子兄弟表示法 2 二叉树2.1 概念2. 2 特殊二叉树2.3 二叉树的性质2.4 二叉树的存储结构 3 堆 — 完全二叉树的顺序结构实现3.1 堆的概念3.2 核心代码3.3 堆应用1 堆排序2 TOP-K问题 4 二叉树的链式存储4.1 二叉链结构与初始化…...

信号平滑或移动平均滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

黑客技术(网络安全)自学

一、黑客是什么 原是指热心于计算机技术&#xff0c;水平高超的电脑专家&#xff0c;尤其是程序设计人员。但后来&#xff0c;黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实&#xff0c;网络信息空间安全已经成为海陆空之…...

使用七牛云、阿里云、腾讯云的对象存储上传文件

说明&#xff1a;存在部分步骤省略的情况&#xff0c;请根据具体文档进行操作 下载相关sdk composer require qiniu/php-sdkcomposer require aliyuncs/oss-sdk-php composer require alibabacloud/sts-20150401composer require qcloud/cos-sdk-v5 composer require qcloud_s…...

使用阿里云DataX完成数据同步

DataX DataX 是阿里云 DataWorks 数据集成的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, datab…...

《Kali渗透基础》13. 无线渗透(三)

kali渗透 1&#xff1a;无线通信过程1.1&#xff1a;Open 认证1.2&#xff1a;PSK 认证1.3&#xff1a;关联请求 2&#xff1a;加密2.1&#xff1a;Open 无加密网络2.2&#xff1a;WEP 加密系统2.3&#xff1a;WPA 安全系统2.3.1&#xff1a;WPA12.3.2&#xff1a;WPA2 3&#…...

python——案例六:判断字符串的长度

案例六&#xff1a;判断字符串的长度str"Study"print(len(str))#输出结果如下&#xff1a; #5...

PC-windows-安卓-Linux音频系统框架概论

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) 一 PC 音频系统工作原理 PC音频系统的工作原理可以简要概括为以下几个步骤: 音频输入:音频信号可以通过多种方式输入到计算机,例如麦克风、线路输入、数字音频接口等。这些音频源会将声音转换为电信号。 模数转换…...

Web Worker API

Web Worker API Web Worker 使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可能。这样做的好处是可以在独立线程中执行费时的处理任务&#xff0c;使主线程&#xff08;通常是 UI 线程&#xff09;的运行不会被阻塞/放慢。 Web Worker概念与用法 Wor…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...