SpringBootTest单元测试—加入@Test无法启动测试方法,什么情况下需要加@RunWith(SpringRunner.class)?

article/2025/9/18 12:06:10

spring环境下单元测试:

SpringBoot环境下单元测试:

        一、SpringBoot2.4.0之后

        二、2.2.0 < SpringBoot < 2.4.

        三、SpringBoot2.2.0之前


最近写SpringBootTest单元测试时,加入@Test无法启动测试方法(我用的是SpringBoot2.2.0之前的版本),然后我根据错误提示找到了解决方法一,但我记得之前学习SpringBoot环境下单元测试不是这样做的,我就翻阅之前的资料,找到了解决方法二,然后我发现之前是不用加@RunWith(SpringRunner.class)的,此时我就不太理解了。之前只会使用,没碰到过什么问题,所以也没去研究过。什么情况下需要加@RunWith(SpringRunner.class),什么情况下不需要加?为了解决疑问,通过查阅资料,分享一下我的总结。

 

 

先说一下我上面的解决方法:

方法一:不加@RunWith,直接导入junit-jupiter坐标

 

方法二:添加注解@RunWith(SpringRunner.class) 

总结一下什么情况下需要使用@RunWith(SpringRunner.class):

spring环境下单元测试:

使用@RunWith(SpringJUnit4ClassRunner.class)设置类运行器

使用@ContextConfiguration设置Spring环境对应的配置类或配置文件

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {@Autowiredprivate BookService bookService;@Testpublic void testSave(){bookService.save();}
}

SpringBoot环境下单元测试:

一、SpringBoot2.4.0之后

1、SpringBoot2.4.0之后,spring-boot-starter-test默认仅支持JUnit5,去掉了兼容JUnit4引擎:org.junit.vintage:junit-vintage-engine,无需添加@RunWith(SpringRunner.class)

@SpringBootTest
class BookServiceTest {@Autowiredprivate BookService bookService;@Testvoid save() {bookService.save();}
}

二、2.2.0 < SpringBoot < 2.4.0

2、2.2.0 < SpringBoot < 2.4.0,spring-boot-starter-test默认使用JUnit5,同时也兼容支持JUnit4,无需添加@RunWith(SpringRunner.class)

@SpringBootTest
class BookServiceTest {@Autowiredprivate BookService bookService;@Testvoid save() {bookService.save();}
}

如果想只用Junit5,可以排除junit-vintage-engine,排除Junit4的干扰,JUnit4中使用的测试引擎是junit-vintage-engine,JUnit5中使用的测试引擎是junit-jupiter-engine

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions>
</dependency>

三、SpringBoot2.2.0之前

1.SpringBoot2.2.0之前,spring-boot-starter-test引入的是JUnit4,使用的测试引擎是junit-vintage-engine

详说一下上面的解决方法:

解决方法一:不加@RunWith,直接导入junit-jupiter坐标

<dependency> <groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.1</version> 
</dependency> 

导入坐标后可以看到junit-jupiter-engine的测试引擎

 

 

解决方法二:添加注解@RunWith(SpringRunner.class)  推荐使用

如果使用SpringBoot2.2.0之前的版本,按照下面这样写就行了

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class TestConnection {@Testpublic void test() {}
}

提示:测试类和方法需要改成public类型,不改的话测试方法无法启动

如果不加@RunWith,测试方法能正常启动,但是测试可能会失败,比如出现@Autowired无法注入等一些问题

 

看一下官方的说明

 如果您使用的是JUnit4,请记得将@RunWith(SpringRunner.class)添加到测试方法中,否则注解将被忽略。如果您使用的是JUnit5,则无需添加等效的@ExtendWith(SpringExtension),因为@SpringBootTest和其他@…Test注解已经包含了这些注解。


http://chatgpt.dhexx.cn/article/1L84GmOq.shtml

相关文章

Run Run Run

学习了 2022 年集训队论文 《浅谈与 Lyndon 理论有关的字符串组合问题》 写得很好&#xff0c;像我这样的字符串小白也能看懂 Lyndon 分解 若字符串 w w w 小于它的每一个真后缀&#xff0c;则称 w w w 是 Lyndon 串。若字符串 w w w 是 Lyndon 串&#xff0c;则 w k w ′…

关于springboot在启动测试类时报错的问题和@RunWith的使用

【1】最重要的一点&#xff1a;测试类启动依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupI…

天呐!惊人的Springboot测试.Springboot测试类之@RunWith注解

Springboot测试类之@RunWith注解 Springboot测试类之@RunWith注解Springboot测试类之@RunWith注解 @runWith注解作用: @RunWith就是一个运行器@RunWith(JUnit4.class)就是指用JUnit4来运行@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境,以便在测试开…

SSM中使用测试类RunWith

RunWith(SpringJUnit4ClassRunner.class) 需要使用两个测试包 <!--测试包--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.7.RELEASE</version></dependency>…

@RunWith的使用

文章目录 RunWith作用RunWith(SpringJunit4ClassRunner.class) 使用说明测试ActiveProfiles("dev") RunWith作用 RunWith 就是一个运行器 RunWith(JUnit4.class) 就是指用JUnit4来运行 RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境 RunWit…

使用命令行创建文件夹和创建文件

进入到指定的目录之后&#xff0c;使用命令&#xff1a;mkdir可以创建新的目录&#xff0c;使用示例&#xff1a; 创建文件&#xff0c;可以使用命令touch&#xff0c;示例&#xff1a;

cmd命令窗口如何创建和删除文件、文件夹,写入内容到文件

首先&#xff0c;同时按住键盘 winR&#xff0c;调出运行窗口&#xff0c;如下图所示&#xff1a; 接下来&#xff0c; &#xff08;1&#xff09;创建文件夹。 使用【 md 文件名 或 mkdir 文件名 】来创建。 完整命令是 md 盘符:\路径\文件夹名&#xff0c;如下图所示&#x…

如何在指定文件夹打开cmd

方法一 1.进入指定的文件夹 &#xff0c;然后选中地址栏&#xff0c;并输入cmd&#xff0c;如下图所示&#xff1a;2.回车&#xff0c;就可以打开对应路径的cmd窗口了&#xff0c;如下图所示&#xff1a; 方法二 1.进入指定的文件夹&#xff0c;按住Shift建鼠标右键&#xff0…

shell、cmd创建文件软连接

&#xff08;一&#xff09;macos shell 一、软链接创建1、创建软链接 ln -s 【目标目录】 【软链接地址】 【目标目录】指软连接指向的目标目录下&#xff0c;【软链接地址】指 “快捷键” 文件名称&#xff0c;该文件是被指令创建的 软链接创建需要同级目录下没有同名的…

windows cmd命令行新建文件,编辑文件,删除文件命令

新建文件 type nul>文件名 编辑文件 copy con 文件名 开始编辑 CTRLz回车保存 删除文件 del 文件名

cmd批量创建文件和文件夹

生成文件夹或者文件 for /l %i in (2,1,10) do md D:\test\新建文件夹%i将上述语句复制到cmd执行即可,如果是批处理要将%i改为%%i,如果是文件&#xff0c;即是 for /l %i in (2,1,10) do cd.> D:\test\新建文件%i.txt学过一点python的应该知道&#xff0c;前面是一个循环语…

cmd命令:批量创建文件夹

for /l %i in (2,1,10) do md D:\test\新建文件夹%i如果是文件&#xff0c;即是 for /l %i in (2,1,10) do cd.> D:\test\新建文件%i.txt学过一点python的应该知道&#xff0c;前面是一个循环语句 &#xff08;2,1,10&#xff09;:编号为2~10&#xff0c;步长为1 md:即make…

使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行

标题使用cmd命令在桌面上新建一个文件夹&#xff0c;且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行 1、在电脑桌面使用快捷键winr打开 2、打开cmd命令界面之后使用md desktop指令进入桌面 3、接下来就可以通过md指令在桌面新建一个SYY文件夹 4、然后…

MySQL语句 实验7 单表条件查询

实验7 单表条件查询 一、实验目的 (1) 掌握SELECT语句的基本用法。 (2) 使用WHERE子句进行有条件的查询。 (3) 掌握使用IN和NOT IN&#xff0c;BETWEEN…AND和NOT BETWEEN…AND来缩小查询范围的方法。 (4) 利用LIKE子句实现字符串匹配查询。 二、实验要求 1、学生提前准…

Mysql 条件查询(like、between、and、in······)

目录 Mysql 条件查询 示例 一、比较运算和逻辑运算符符 二、范围运算符 三、列表运算符 四、模糊匹配符 五、空值判断符 Mysql 条件查询 Mysql 条件查询即where子句后跟条件 运算符&#xff1a; 格式&#xff1a; select 字段 from 表名 where 条件; 示例 使用下表为…

Mysql条件查询语句(二)

一、between……and……操作符 1、查询薪水为1600到3000的员工(第一种方式:采用>= 、<=) 例如:select empno,ename,sal from emp where sal >= 1600 and sal <= 3000; 2、查询薪水为1600到3000的员式(第二种方式:采用between…and…) 例如:select em…

mysql条件查询出现or连接时会使用索引的场景

在做sql优化时&#xff0c;通常会避免使用or来进行条件连接&#xff0c;是因为大多数情况下or的条件连接会导致sql查询进行全表扫描而不会使用索引去查询。但并不是所有使用or的场景都会全表扫描&#xff0c;有些场景下使用or依旧会走索引去查询&#xff0c;下面举例说明。 表…

MySQL 流式查询

大数据量查询容易OOM&#xff1f;试试MySQL流式查询 一、前言 程序访问MySQL数据库时&#xff0c;当查询出来的数据量特别大时&#xff0c;数据库驱动把加载到的数据全部加载到内存里&#xff0c;就有可能会导致内存溢出&#xff08;OOM&#xff09;。其实在MySQL数据库中提供…

MySQL --- 数据库查询 - 条件查询

条件查询 我们知道从 MySQL 表中使用 SELECT 语句来查询数据&#xff0c;如需有条件地从表中选取数据&#xff0c;可将 WHERE 子句添加到 SELECT 语句中。 语法 SELECT 字段名 FROM 表名 WHERE 条件; 运算符表 BETWEEN 后面是最小值&#xff0c;AND 后面是最大值&#xff0c;…

Mysql条件查询json数据

前言 ❤Java学习路线个人总结-博客 ❤欢迎点赞&#x1f44d;收藏⭐留言 &#x1f4dd;分享给需要的小伙伴 1、Mysql数据库对应数据 2、查询条件 #模糊查询JSON select * from test where json_value->$.name LIKE %是% #不等于空 SELECT * FROM test WHERE json_value->…