Spring 对 Junit4,Junit5 的支持上的运用

spring,junit4,junit5 · 浏览次数 : 0

小编点评

**Spring JUnit4 测试类** ```java @ExtendWith(SpringExtension.class) @ContextConfiguration(\"classpath:spring.xml\") public class SpringJunit4Test { @Resource(name = "user") private User user; @Test public void testUser() { System.out.println(user.getName()); } @Test public void testUser2() { System.out.println(user.getName()); } @Test public void testUser3() { System.out.println(user.getName()); } } ``` **JUNIT5 测试类** ```java @ExtendWith(SpringExtension.class) @ContextConfiguration("classpath:spring.xml") public class SpringJunit5Test { @Resource(name = "user") private User user; @Test public void testUser() { System.out.println(user.getName()); } @Test public void testUser2() { System.out.println(user.getName()); } @Test public void testUser3() { System.out.println(user.getName()); } } ``` **一些说明** * `@Resource` 注解用于在 JUnit5 中注入 `User` 对象。 * `@ExtendWith` 注解用于配置 Spring 测试扩展。 * `@ContextConfiguration` 注解用于指定测试类的配置类路径。 * `@Resoure` 注解用于非简单类型的注入,并将其注入到 `user` 属性中。

正文

1. Spring 对 Junit4,Junit5 的支持上的运用

@


每博一文案

关于理想主义,在知乎上看到一句话:“他们并不是不懂别人口中的现实,他们只是不信,事情只能是现在这个样子。”
     错误的、肮脏的、混乱的、轻松自如的、自言尽力了,有人真的不懂么?为了利益和怠惰做出这样那样或好或坏的事情,什么动物都会。有人会开脱和找借口,说着现实就是如此啊,无力改变世界就改变自己啊。他们对现状摇摇头然后果断投入到漆黑的污水里去,义无反顾地。
     但理想主义者是不信的,他们先是在语言上画一个大问号,再用行动画一个大叹号。
     他先问你,怎么就非得这样不可?怎么就没了别的办法?然后再用做出来的事情告诉你,我告诉你就是还能有更干净、更温和、更有效的办法!
     他们自己也有不能一尘不染的时候。但他们看着满目漆黑也不信世界上就没有洁白、干净这回事。
     理想主义者就是不会相信生活和世界就是这样了。不管它是别人眼中的好,还是坏。
   “一定有更好的办法,也能够通过合理的方式,缓慢地改善世界。愿意为了自己的理想而做些什么,甚至也愿意去牺牲什么。对于自己的手段、目的与认知,始终心怀疑问。即使做出的一切都看不到所谓的成效。即使这改变在活着的时候甚至也看不到。知道世界比较容易被忍受的这部分,是很多人用了很多代价换来的。但不会停下对好的东西的向往,还有向光明的地方行走的脚步。”
     这才算理想主义者吧。往往是重视精神价值超过物质利益。理想主义者把对精神价值的追求看作人生的主要追求,这些精神价值包括:尊严、正义、爱、美等等。
    而浪漫主义,诺瓦利斯说过:
   “在我看来,把普通的东西赋予崇高的意义,给平凡的东西披上神秘的外衣,使熟知的东西恢复未知的尊严,对有限的东西给予无限的外观,这就是浪漫化。反过来说,这就是变得崇高、未知、神秘和无限的过程,通过这种联系,这一浪漫化过程就会被对数化。它得到一个常用的表达:浪漫哲学。”

2. Spring对Junit4 的支持

准备工作,先在pom.xml 文件当中,导入相关依赖的 jar 包信息,如下:

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rainbowsea</groupId>
    <artifactId>spring6-015-junit</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <!--仓库-->
    <repositories>
        <!--spring里程碑版本的仓库-->
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <!--        spring context 依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.11</version>
        </dependency>

        <!--        spring 对 Junit 支持的依赖-->
        <!--spring对junit的支持相关依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <!--            这个版本spring6,既支持Junit4 又支持Junit5-->
            <version>6.0.11</version>
        </dependency>

        <!--        junit4依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!--        @Resoure 注解 非简单类型的注入,赋值-->
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>


    </dependencies>

</project>

准备好,对于的 Bean 对象用于测试:注意:需要将其 Bean 对象纳入到 Spring IOC 容器当中进行管理上。

在这里插入图片描述

package com.rainbowsea.spring6.bean;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(value = "user")   // 交给 Spirng IOC 容器管理
public class User {
    @Value("张三") // spring 当中 value()注解简单类型的,set注入,赋值
    private String name;

    public User(String name) {
        this.name = name;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

配置相关的:spring.xml 的配置信息的内容,这里我们用的是注解时开发,需要加上一个组件扫描

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!--    组件扫描-->
    <context:component-scan base-package="com.rainbowsea.spring6.bean"></context:component-scan>
</beans>

单元测试:(一般平常的单元测试)如下:

在这里插入图片描述

在这里插入图片描述

上述:方式,代码重复率高,复用性较差。

Spring提供的方便主要是这几个注解:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")注意该:spring.xml 文件要一定要在类路径下才行
在单元测试类上使用这两个注解之后,在单元测试类中的属性上可以使用 @Autowired。比较方便。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml") // 注意该:spring.xml 文件要一定要在类路径下才行

优化如下:

在这里插入图片描述

在这里插入图片描述

使用@Resource 需要导入相关的 jar 包,如下:

在这里插入图片描述

<!--        @Resoure 注解 非简单类型的注入,赋值-->
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>

在这里插入图片描述

同时注意:该Juit4的@ Test 的注解是在:org.junit.Test; 包下的

在这里插入图片描述

package com.rainbowsea.spring6.test;

import com.rainbowsea.spring6.bean.User;
import jakarta.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class SpringJunit4Test2 {

    @Resource(name = "user")
    private User user;

    @Test
    public void testUser() {
        System.out.println(user.getName());
    }


    @Test
    public void testUser2() {
        System.out.println(user.getName());
    }

    @Test
    public void testUser3() {
        System.out.println(user.getName());
    }


}

3. Spring对Junit5的支持

引入JUnit5的依赖,Spring对JUnit支持的依赖还是:spring-test,同时换成,junit5 ,还是在 pom.xml 文件当值配置相关依赖的 jar 如下:

在这里插入图片描述

 <!--        junit5 依赖-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.9.0</version>
            <scope>test</scope>
        </dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rainbowsea</groupId>
    <artifactId>spring6-015-junit</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <!--仓库-->
    <repositories>
        <!--spring里程碑版本的仓库-->
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <!--        spring context 依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.11</version>
        </dependency>

        <!--        spring 对 Junit 支持的依赖-->
        <!--spring对junit的支持相关依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <!--            这个版本spring6,既支持Junit4 又支持Junit5-->
            <version>6.0.11</version>
        </dependency>

        <!--        junit5 依赖-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.9.0</version>
            <scope>test</scope>
        </dependency>

        <!--        @Resoure 注解 非简单类型的注入,赋值-->
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>




    </dependencies>

</project>


还是使用上面的 User 的 bean 对象进行测试:

在这里插入图片描述

在JUnit5当中,可以使用Spring提供的以下两个注解,标注到单元测试类上,这样在类当中就可以使用@Autowired注解了。

@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:spring.xml")  // 同样一定要是在类路径下

@ContextConfiguration("classpath:spring.xml") // 同样一定要是在类路径下

在这里插入图片描述

同时注意:该Juit5 的@ Test 的注解是在:org.junit.jupiter.api.Test 包下的 ,选择的时候不要,弄错了。

在这里插入图片描述

单元测试:

在这里插入图片描述

package com.rainbowsea.spring6.test;


import com.rainbowsea.spring6.bean.User;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:spring.xml")
public class SpringJunit5Test {

    @Resource(name = "user")  // 非简单类型的注入,赋值,交给Spring管理
    private User user;


    @Test  // import org.junit.jupiter.api.Test;
    public void testUser() {
        System.out.println(user.getName());
    }


    @Test  // import org.junit.jupiter.api.Test;
    public void testUser2() {
        System.out.println(user.getName());
    }

    @Test  // import org.junit.jupiter.api.Test;
    public void testUser3() {
        System.out.println(user.getName());
    }



}

4. 总结:

  1. Spring 对 Junit4 的依赖的 jar 包,同时
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml") // 注意该:spring.xml 文件要一定要在类路径下才行
  1. 同时注意:该Juit4的@Test 的注解是在:org.junit.Test; 包下的
  2. Spring 对 Junit5 的依赖的 jar 包,同时
@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:spring.xml")  // 同样一定要是在类路径下
  1. 无论是 Junit4 还是 Junit5 当中的 @ContextConfiguration 注解当中的 @ContextConfiguration("classpath:spring.xml") 都是:一定要是在类路径下才行的。
  2. 关于:Spring 对 Junit4,Junit5 的支持运用,大家灵活选择运用即可,并不是非要选择其中的哪个哪个啥的。满足业务即可。

5. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

与Spring 对 Junit4,Junit5 的支持上的运用相似的内容:

Spring 对 Junit4,Junit5 的支持上的运用

1. Spring 对 Junit4,Junit5 的支持上的运用 @目录1. Spring 对 Junit4,Junit5 的支持上的运用每博一文案2. Spring对Junit4 的支持3. Spring对Junit5的支持4. 总结:5. 最后: 每博一文案 关于理想主义,在知乎上看到一句话:

Spring Boot 1.5.x 结合 JUnit5 进行接口测试

在Spring Boot 1.5.x中,默认使用Junit4进行测试。而在对Controller进行接口测试的时候,使用 @AutoConfigureMockMvc 注解是不能注入 MockMvc 对象的。因此只能使用 WebApplicationContext 类去构建 MockMvc 对象。 在

Spring Boot 单元测试笔记

1. 导入JUnit5测试框架 org.springframework.boot spring-boot-starter-test test

Spring 面向切面编程AOP 详细讲解

1. Spring 面向切面编程AOP 详细讲解 @目录1. Spring 面向切面编程AOP 详细讲解每博一文案2. AOP介绍说明2.1 AOP的七大术语2.2 AOP 当中的 切点表达式3. 使用Spring 对 AOP 的实现使用3.1 准备工作3.2 Spring 基于AspectJ的AO

面试官:谈谈对SpringAI的理解?

Spring AI 已经发布了好长时间了,目前已经更新到 1.0 版本了,所以身为 Java 程序员的你,如果还对 Spring AI 一点都不了解的话,那就有点太落伍了。 言归正传,那什么是 Spring AI?如何快速进行 Spring AI 开发呢? 1.什么是Spring AI? Sprin

OpenTelemetry agent 对 Spring Boot 应用的影响:一次 SPI 失效的案例

背景 前段时间公司领导让我排查一个关于在 JDK21 环境中使用 Spring Boot 配合一个 JDK18 新增的一个 SPI(java.net.spi.InetAddressResolverProvider) 不生效的问题。 但这个不生效的前置条件有点多: JDK 的版本得在 18+ Spri

OpenTelemetry agent 对 Spring Boot 应用的影响:一次 SPI 失效的

背景 前段时间公司领导让我排查一个关于在 JDK21 环境中使用 Spring Boot 配合一个 JDK18 新增的一个 SPI(java.net.spi.InetAddressResolverProvider) 不生效的问题。 但这个不生效的前置条件有点多: JDK 的版本得在 18+ Spri

一文解析Spring JDBC Template的使用指导

摘要:Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发。 本文分享自华为云社区《Spring JdbcTemplate使用解析》,作者: 共饮一杯无 。 Spring框架对JDBC的简单封装。提供了一个JDBC Template对象简化JDBC的开发 步

手写模拟Spring底层原理-Bean的创建与获取

相信大家对Spring都有一定的了解,本篇文章我们会针对Spring底层原理,在海量的Spring源代码中进行抽丝剥茧手动实现一个Spring简易版本,对Spring的常用功能进行手写模拟实现。

Spring面试攻略:如何展现你对Spring的深入理解

本次面试涉及了Spring框架的多个方面,包括IOC和AOP的理解、Spring容器的启动流程、Bean的创建过程、Bean的线程安全性、循环依赖的处理、事务的处理以及Spring MVC中控制器的线程安全性。通过这些问题的回答,展示了对Spring框架的深入理解和应用经验。同时,也凸显了对面试题目的认真思考和清晰表达的能力。