当前位置: 首页 > 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…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...