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 {
    @Autowired
    public UserDao userDao;

    @Autowired
    public UserService userService;

    @Autowired
    @Qualifier(value = "dataSource_druid")
    public DataSource dataSourceDruid;

    @Autowired
    @Qualifier(value = "dataSource_c3p0")
    public DataSource dataSourceC3p0;

    @Test
    public void test1() throws SQLException {
        System.out.println(dataSourceDruid.getConnection());
        System.out.println(dataSourceC3p0.getConnection());
    }

    @Test
    public 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 {

    @Test
    public void test1() {
        System.out.println("Test 1 is executed.");
    }

    @Test
    public 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 容器并进行集成测试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp android底部弹框

uniapp android底部弹框&#xff0c;带有动画效果 <view class"popup_box"><view class"bottom_more" click"handleClickCancel"><image src"/static/images/rescue/icon_more.png"></image></view><…

C++笔记之从数组指针到函数数组指针(使用using name和std::function)

C笔记之从数组指针到函数数组指针(使用using name和std::function) 参考笔记&#xff1a; C之指针探究(三)&#xff1a;指针数组和数组指针 C之指针探究(十三)&#xff1a;函数指针数组 C之指针探究(二)&#xff1a;一级指针和一维数组 C之指针探究(十一)&#xff1a;函数名的…

C语言数组笔试题(详解)

目录 插入知识&#xff1a; 一.指向函数指针数组的指针 二.回调函数 什么是回调函数&#xff1f; 三.数组笔试题 个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#xff1a;GOTXX &#x1f4…

Jenkins工具系列 —— 插件 实现用户权限分配与管理

文章目录 安装插件 Role-based Authorization Strategy添加用户注册配置权限查看当前使用者&#xff0c;获取user id配置管理员权限配置普通用户权限&#xff08;非管理员权限&#xff09; 小知识 安装插件 Role-based Authorization Strategy 点击 左侧的 Manage Jenkins —&…

【PostgreSQL】系列之 一 用户创建和授权(三)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

Michael.W基于Foundry精读Openzeppelin第20期——EnumerableMap.sol

0. 版本 [openzeppelin]&#xff1a;v4.8.3&#xff0c;[forge-std]&#xff1a;v1.5.6 0.1 EnumerableMap.sol Github: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/utils/structs/EnumerableMap.sol EnumerableMap库提供了Bytes32ToB…

使用Python将图像转换为PDF:一次性解决您的批量转换需求

导语&#xff1a; 在数字化时代&#xff0c;我们经常需要处理大量的图像文件。将这些图像转换为PDF格式可以方便地存档、分享和打印。本文将介绍如何使用Python编程语言将图像批量转换为PDF&#xff0c;并提供了一个简单易用的图形界面来跟踪转换进度。 准备工作 在开始之前…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报

天气&#xff08;自然现象&#xff09; 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象&#xff0c;即某瞬时内大气中各种气象要素&#xff08;如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

kibana-7.17.3版本安装及汉化

1、官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 选择安装系统类型和历史版本kibana安装版本要和es版本对应 2、上传安装包然后解压 tar -zxf kibana-7.17.3-linux-x86_64.tar.gz 3、更改目录属主 chown elk. kibana-7.17.3-linux-x86_64 -R …

【QT调用ST-link-使用QT编写程序-调用ST-LINK_CLI.exe-烧写STM32F4xxx-基础样例】

【QT结合ST-link&#xff0c;使用QT编写程序&#xff0c;调用ST-LINK_CLI.exe,烧写STM32F4xxx-基础样例】 1、前言2、实验环境3、先前了解-自我总结4、实验过程&#xff08;0&#xff09;硬件连接与供电&#xff08;1&#xff09;安装&使用STM32 ST-LINK Utility&#xff0…

65 # 实现 http-server 里的 gzip 压缩

用 zlib 来实现 gzip 压缩 服务端优化都是&#xff1a;压缩 缓存 前端可以通过 webpack 插件进行压缩 gzip 根据替换来实现的&#xff0c;重复率越高&#xff0c;压缩后的结果越小 const zlib require("zlib"); const fs require("fs"); const path …

BI报表工具有哪些作用?奥威BI全面剖析数据

BI报表工具有哪些作用&#xff1f;主要的作用是通过整合多业务来源数据&#xff0c;全面分析挖掘数据&#xff0c;来帮助企业实现数据化运营、支持智能决策、实现数据资产沉淀和增值、进行数据挖掘和预测分析、提高数据可读性和数据可视化程度等&#xff0c;从而提高企业的竞争…

ORCA优化器浅析——CQueryContext对优化器的要求

从ORCA优化器浅析——重要主流程概述中可以知道进入真正优化器引擎执行流程之前需要对优化器提出要求&#xff0c;比如后面会提到的required columns、required sort orders等。而CQueryContext即是承载这些内容的类。首先CQueryContext类是通过PqcGenerate函数构造的&#xff…

LabVIEW开发3D颈动脉图像边缘检测

LabVIEW开发3D颈动脉图像边缘检测 近年来&#xff0c;超声图像在医学领域对疾病诊断具有重要意义。边缘检测是图像处理技术的重要组成部分。边缘包含图像信息。边缘检测的主要目的是根据强度和纹理等属性识别图像中均匀区域的边界。超声&#xff08;US&#xff09;图像存在视觉…

SpringCloud入门Day01-服务注册与发现、服务通信、负载均衡与算法

SpringCloudNetflix入门 一、应用架构的演变 伴随互联网的发展&#xff0c;使用互联网的人群越来越多&#xff0c;软件应用的体量越来越大和复杂。而传统单体应用 可能不足以支撑大数据量以及发哦并发场景应用的框架也随之进行演变从最开始的单体应用架构到分布式&#xff08…

利用OpenCV实现图像拼接

一、介绍 图像拼接. 二、分步实现 要实现图像拼接&#xff0c;简单来说有以下几步&#xff1a; 对每幅图进行特征点提取对对特征点进行匹配进行图像配准把图像拷贝到另一幅图像的特定位置对重叠边界进行特殊处理 PS&#xff1a;需要使用低版本的opencv&#xff0c;否则无法使…

socker套接字

1.打印错误信息 2.socketaddr_in结构体 结构体&#xff1a; &#xff08;部分库代码&#xff09; (宏中的##) 3.manual TCP: SOCK_STREAM &#xff1a; 提供有序地&#xff0c;可靠的&#xff0c;全双工的&#xff0c;基于连接的流式服务 UDP: 面向数据报

[Docker实现测试部署CI/CD----自由风格和流水线的CD操作(6)]

目录 12、自由风格的CD操作发布 V1.0.0 版本修改代码并推送GitLab 中项目打 Tag 发布 V2.0.0 版本Jenkins 配置 tag 参数添加 Git 参数添加 checkout 命令修改构建命令配置修改 SSH 配置 部署 v1.0.0重新构建工程构建结果 部署 v2.0.0重新构建工程访问 部署v3.0.0 13、流水线任…

计算机成下一个土木了吗?

前些年抓住了互联网行业的红利期&#xff0c;进入大厂的员工&#xff0c;基本可以实现在一线城市买房扎根。 但反观现在&#xff0c;“被毕业、逃离互联网、躺平算了...”却成了这个行业的主旋律&#xff0c;不少人在谈论润到国企和外企去了&#xff0c;也放低了对工资的预期&…

Java SpringBoot集成Activiti7工作流

Activiti7 Java SpringBoot集成Activiti7工作流介绍项目集成引入依赖YML配置文件配置类 启动项目生成表结构Activiti的数据库支持 Activiti数据表介绍项目Demo地址&#xff1a; Java SpringBoot集成Activiti7工作流 本文项目Demo地址附在文章后方 官网主页&#xff1a;http://a…