后端篇——第一章 Maven基础全面教程

目录

一、初识Maven

[1.1 Maven介绍](#1.1 Maven介绍)

[1.2 Maven的核心作用](#1.2 Maven的核心作用)

[1.2.1 依赖管理](#1.2.1 依赖管理)

[1.2.2 项目构建](#1.2.2 项目构建)

[1.2.3 统一项目结构](#1.2.3 统一项目结构)

二、Maven概述

[2.1 Maven基本介绍](#2.1 Maven基本介绍)

[2.2 Maven核心模型](#2.2 Maven核心模型)

[2.2.1 构建生命周期/阶段](#2.2.1 构建生命周期/阶段)

[2.2.2 项目对象模型(POM)](#2.2.2 项目对象模型(POM))

[2.2.3 依赖管理模型(Dependency)](#2.2.3 依赖管理模型(Dependency))

[2.3 Maven仓库](#2.3 Maven仓库)

[2.4 Maven安装与配置](#2.4 Maven安装与配置)

[2.4.1 下载](#2.4.1 下载)

[2.4.2 安装配置步骤](#2.4.2 安装配置步骤)

三、IDEA集成Maven

[3.1 创建Maven项目](#3.1 创建Maven项目)

[3.1.1 全局设置](#3.1.1 全局设置)

[3.1.2 新建Maven项目](#3.1.2 新建Maven项目)

[3.1.3 Maven项目目录结构](#3.1.3 Maven项目目录结构)

[3.1.4 pom文件详解](#3.1.4 pom文件详解)

[3.2 Maven坐标详解](#3.2 Maven坐标详解)

[3.3 导入Maven项目](#3.3 导入Maven项目)

四、依赖管理

[4.1 依赖配置](#4.1 依赖配置)

[4.1.1 基本配置步骤](#4.1.1 基本配置步骤)

[4.1.2 依赖坐标查找方法](#4.1.2 依赖坐标查找方法)

[4.2 Maven生命周期](#4.2 Maven生命周期)

[4.2.1 生命周期介绍](#4.2.1 生命周期介绍)

[4.2.2 生命周期执行方式](#4.2.2 生命周期执行方式)

五、单元测试

[5.1 测试基础概念](#5.1 测试基础概念)

[5.1.1 测试阶段划分](#5.1.1 测试阶段划分)

[5.1.2 测试方法分类](#5.1.2 测试方法分类)

[5.2 JUnit入门](#5.2 JUnit入门)

[5.2.1 JUnit简介](#5.2.1 JUnit简介)

[5.2.2 JUnit入门程序](#5.2.2 JUnit入门程序)

[5.3 断言](#5.3 断言)

[5.4 常见注解](#5.4 常见注解)

[5.5 依赖范围](#5.5 依赖范围)


Maven是一个用于管理和构建Java项目的工具,主要功能包括依赖管理、项目构建和统一项目结构。本文详细介绍了Maven的安装配置、IDEA集成、依赖管理以及单元测试等内容。在依赖管理方面,Maven通过坐标系统自动下载和管理jar包;在项目构建方面,Maven提供了标准化的构建生命周期;在单元测试部分,重点讲解了JUnit框架的使用方法,包括断言和常见注解。通过Maven可以简化Java项目的开发流程,提高开发效率和质量保证。

一、初识Maven

1.1 Maven介绍

Maven 是一款用于管理和构建Java项目的工具,是Apache旗下的一个开源项目 。

Apache 软件基金会成立于1999年7月,是目前世界上最大且最受欢迎的开源软件基金会,也是专门为支持开源项目而生的非盈利性组织。其开源项目列表可查看:https://www.apache.org/index.html#projects-list

在JavaSE阶段,即使不使用Maven也能构建Java项目,那为何还要学习Maven呢?接下来我们将详细介绍Maven的核心作用。

1.2 Maven的核心作用

1.2.1 依赖管理

Maven可方便快捷地管理项目依赖的资源(jar包),有效避免版本冲突问题。我们通过对比使用Maven前后的差异来理解这一功能:

  1. 使用Maven前

项目中需要使用某个jar包时,需先从官方网站下载该jar包,再手动导入到项目中才能使用。

  1. 使用Maven后

只需在Maven项目的pom.xml文件中添加一段配置,Maven就会自动根据配置信息下载对应的依赖,无需手动操作即可直接在项目中使用。

1.2.2 项目构建

Maven提供了标准化的跨平台自动化构建方式。开发一套系统通常需要经历编译、测试、打包、发布等流程,这些重复操作若手动完成会十分繁琐,而Maven通过简单命令即可完成全部构建流程。

通过Maven的命令(如compile、test、package、deploy等),可轻松完成项目的编译、测试、打包、发布等操作,且这些命令支持Windows、Linux、Mac等多种操作系统,具备良好的跨平台性。

1.2.3 统一项目结构

Maven提供了标准、统一的项目结构,解决了不同开发工具创建的项目无法互通的问题:

  1. 未使用Maven时

Java开发工具种类繁多(如IDEA、Eclipse、MyEclipse等),不同工具创建的Java项目目录结构存在差异,导致Eclipse创建的项目无法直接导入IDEA,IDEA创建的项目也无法直接导入Eclipse,影响开发效率。

  1. 使用Maven后

Maven规定了一套标准的Java项目目录结构,无论使用何种开发工具,基于Maven构建的项目目录结构都完全一致,可直接在不同开发工具间导入使用,极大提升了开发便捷性。

Maven标准项目目录说明:main目录存放项目源代码,test目录存放项目测试代码;main和test目录下均包含java目录(存放源代码文件)和resources目录(存放配置文件)。

总结:Maven是一款用于管理和构建Java项目的工具,其核心价值在于简化项目依赖管理、标准化项目构建流程、统一项目目录结构。

本教程将Maven内容分为核心和进阶两部分,本章先讲解Maven核心内容,Maven进阶内容将在Web开发阶段后续讲解。

二、Maven概述

2.1 Maven基本介绍

Apache Maven是一个项目管理和构建工具,它基于项目对象模型(Project Object Model,简称POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。

Maven官网:https://maven.apache.org/

Maven核心作用总结:1. 方便的依赖管理;2. 统一的项目结构;3. 标准的项目构建流程。

2.2 Maven核心模型

Maven包含三大核心模型,分别是:

  • 项目对象模型(Project Object Model,POM)
  • 依赖管理模型(Dependency)
  • 构建生命周期/阶段(Build lifecycle & phases)

2.2.1 构建生命周期/阶段

上图中紫色框部分用于完成标准化构建流程。Maven为不同的构建阶段提供了对应的插件,例如编译阶段有编译插件、打包阶段有打包插件等,通过插件实现具体的构建操作。

2.2.2 项目对象模型(POM)

上图中紫色框部分属于项目对象模型,即将项目抽象为一个对象模型,每个Maven项目都有专属的坐标。坐标是资源(jar包)的唯一标识,通过坐标可精准定位所需资源(jar包)的位置。

Maven坐标由三部分组成:

  • groupId:组织名(通常为域名反写,如com.itheima)
  • artifactId:模块名(即项目或模块的名称,如order-service、goods-service)
  • Version:版本号(如1.0-SNAPSHOT、1.0-RELEASE)

2.2.3 依赖管理模型(Dependency)

上图中紫色框部分属于依赖管理模型,通过坐标描述当前项目依赖的第三方jar包。与传统手动复制jar包到lib目录的方式不同,Maven项目只需在pom.xml中配置依赖的坐标信息,对应的jar包会存储在本地Maven仓库中,供项目直接引用。

2.3 Maven仓库

Maven仓库用于存储资源,主要管理各种jar包,其本质是计算机上的一个目录(文件夹),用于存放开发过程中所需的所有依赖(jar包)和插件。

Maven仓库分为三类:

  • 本地仓库:用户计算机上的一个目录,用于存储本地项目所需的jar包
  • 远程仓库(私服):通常由公司或团队搭建的私有仓库,用于存储内部项目依赖或共享资源

Maven项目依赖jar包的查找顺序:

  1. 当项目通过坐标引入依赖后,首先查找本地仓库是否存在对应jar包:
  • 若存在,直接在项目中引用
  • 若不存在,自动连接中央仓库下载对应jar包到本地仓库,再进行引用
  1. 若项目配置了远程仓库(私服),查找顺序变为:本地仓库 → 远程仓库 → 中央仓库

2.4 Maven安装与配置

要使用Maven,需先完成下载与安装配置,具体步骤如下:

2.4.1 下载

Maven官方下载地址:https://maven.apache.org/download.cgi

以下安装步骤是以apache-maven-3.9.4-bin.zip为例子。

2.4.2 安装配置步骤

Maven安装配置需完成4个核心步骤:1. 解压安装;2. 配置本地仓库;3. 配置阿里云私服;4. 配置环境变量。

1) 解压安装

将下载的apache-maven-3.9.4-bin.zip压缩包解压到无中文、无特殊字符的路径下(如E:\develop),解压即完成安装。

解压后目录说明:

  • bin目录:存放可执行命令(重点关注mvn命令)
  • conf目录:存放Maven配置文件(后续需修改settings.xml文件)
  • lib目录:存放Maven运行所需的依赖jar包(Maven基于Java开发,需依赖其他jar包)

2) 配置本地仓库

  • 1.在本地计算机新建一个目录作为本地仓库(用于存储jar包),例如E:\maven-repo
  • 2.进入Maven解压目录的conf文件夹,找到settings.xml配置文件,用记事本或专业编辑工具打开
  • 3.定位到文件第53行左右,复制<localRepository>标签,粘贴到注释外部(如第55行)
  • 将新建的本地仓库路径(如E:\maven-repo)替换掉<localRepository>标签体中的内容,保存文件

3) 配置阿里云私服

由于中央仓库位于国外,下载jar包速度较慢,阿里云提供了开源项目jar包的远程仓库,配置后可大幅提升下载速度。配置步骤:

  1. 打开conf目录下的settings.xml文件,定位到第160行左右的<mirrors>标签
  1. 在<mirrors>标签内添加如下<mirror>子标签,保存文件:

    xml
    <mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>

注意:配置需放在<mirrors>...</mirrors>标签中间,不可放于标签外部。

4) 配置环境变量

Maven环境变量配置类似JDK环境变量配置,具体步骤:

1.打开系统环境变量配置界面(Win10:此电脑→属性→高级系统设置→环境变量),在系统变量区域点击"新建",变量名设为MAVEN_HOME,变量值设为Maven解压安装目录

(如E:\develop\apache-maven-3.9.4),点击确定

2.找到系统变量中的Path变量,点击"编辑",添加%MAVEN_HOME%\bin,点击确定保存

3.验证配置:打开DOS命令提示符(Win+R→cmd),输入mvn -v命令,若显示Maven版本、Java版本等信息,说明配置成功,命令为:

复制代码
mvn -v

5) 配置关联JDK版本(可选)

若需指定Maven项目的JDK版本,可在settings.xml文件的<profiles>标签内添加如下配置(以JDK17为例):

复制代码
<profile>
        <id>jdk-17</id>
        <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>17</jdk>
        </activation>
        <properties>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
                <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
        </properties>
</profile>

三、IDEA集成Maven

要在IDEA中使用Maven进行项目构建,需先完成IDEA与Maven的集成配置,具体包括全局设置、项目创建、坐标使用及项目导入等操作。

3.1 创建Maven项目

3.1.1 全局设置

全局设置可确保后续新建项目默认使用配置好的Maven环境,步骤:

1.进入IDEA欢迎页面,选择File → Close Project → Customize → All settings

2.在打开的All settings页面中,选择Build,Execution,Deployment → Build Tools → Maven

3.配置Maven主目录(Maven解压安装目录)、用户设置文件(conf/settings.xml)、本地仓库(已配置的本地仓库路径)

配置工程编译版本为17(与JDK版本一致)

点击Apply→OK保存配置,此时设置的信息为全局配置,后续新建项目默认使用此配置。

3.1.2 新建Maven项目

1.打开IDEA,创建空项目,命名为web-project01

2.进入项目后,点击小齿轮→Project Structure,设置项目JDK版本为17

3.右键项目,选择New → Module,选择Java语言,勾选Maven,点击Next,填写模块基本信息(GroupId、ArtifactId、Version),点击Finish完成模块创建

4.在Maven模块的src/main/java目录下创建HelloWorld类,编写简单代码并运行,验证项目创建成功

3.1.3 Maven项目目录结构

标准Maven项目目录结构如下:

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| text maven-project01 |--- src (源代码目录和测试代码目录) |--- main (源代码目录) |--- java (源代码java文件目录) |--- resources (源代码配置文件目录) |--- test (测试代码目录) |--- java (测试代码java目录) |--- resources (测试代码配置文件目录) |--- target (编译、打包生成文件存放目录) |

3.1.4 pom文件详解

POM(Project Object Model)即项目对象模型,通过pom.xml文件描述当前Maven项目的核心信息。标准pom.xml文件内容如下:

XML 复制代码
<?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">
    <!-- POM模型版本 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 当前项目坐标 -->
    <groupId>com.itheima</groupId>
    <artifactId>maven-project01</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <!-- 项目的JDK版本及编码 -->
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

pom.xml标签说明:

  • <project>:pom文件的根标签,代表当前Maven项目
  • <modelVersion>:声明项目描述遵循的POM模型版本,目前最新版本为4.0.0,是必选标签
  • 坐标标签(<groupId>、<artifactId>、<version>):三者组合唯一标识项目在本地仓库中的位置
  • <maven.compiler.source>:指定编译JDK版本
  • <maven.compiler.target>:指定运行JDK版本
  • <project.build.sourceEncoding>:设置项目字符集(如UTF-8)

3.2 Maven坐标详解

Maven坐标是资源的唯一标识,通过坐标可唯一定位资源位置,用于定义项目或引入项目所需依赖。

Maven坐标核心组成(与pom.xml中的坐标标签一致):

  • groupId:定义当前Maven项目隶属的组织名称,通常为域名反写(如com.itheima)
  • artifactId:定义当前Maven项目名称,通常为模块名称(如order-service、goods-service)
  • version:定义当前项目版本号,常见版本类型:
  • SNAPSHOT:快照版本,功能不稳定、处于开发中的版本
  • RELEASE:发行版本,功能趋于稳定、停止更新,可用于正式发布的版本

如下图就是使用坐标表示一个项目:

注意事项:

  • 坐标可标识的资源包括插件、依赖、当前项目等
  • 若当前项目需被其他项目依赖,必须在pom.xml中配置坐标信息。

3.3 导入Maven项目

在IDEA中导入已有的Maven项目有两种常用方式:

方式一:通过Project Structure导入

  1. 打开IDEA,选择File → Project Structure → Modules

  2. 点击"Import Module",选择需导入的Maven项目的pom.xml文件

  3. 按照向导完成导入,即可在IDEA中打开该Maven项目

方式二:通过Maven面板导入

  1. 打开IDEA右侧的Maven面板(若未显示,可通过View → Tool Windows → Maven打开)

  2. 点击面板中的"+"(Add Maven Projects)按钮

  3. 选择需导入的Maven项目的pom.xml文件,点击OK即可完成导入

四、依赖管理

依赖指当前项目运行所需的jar包,Maven的依赖管理功能可简化jar包的引入、更新及冲突处理流程。本节将详细讲解依赖配置、依赖传递、依赖排除等核心操作。

4.1 依赖配置

4.1.1 基本配置步骤

在Maven项目中引入依赖需完成以下步骤(以引入spring-context依赖为例):

  1. 在pom.xml文件中编写<dependencies>标签(若已存在可直接使用)
  1. 在<dependencies>标签内使用<dependency>标签引入具体依赖的坐标(groupId、artifactId、version)
  1. 配置示例:
XML 复制代码
<dependencies>
    <!-- 依赖 : spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.1.4</version>
    </dependency>
</dependencies>
  1. 点击IDEA中pom.xml文件右上角的"刷新"按钮,引入最新配置的依赖

依赖刷新说明:每次新增或修改依赖配置后,需点击刷新按钮,确保Maven能加载最新的依赖信息。

注意事项:

  • 若引入的依赖在本地仓库不存在,Maven会自动连接远程仓库/中央仓库下载,下载过程耗时与网络速度相关,需耐心等待

4.1.2 依赖坐标查找方法

获取依赖坐标有三种常用方式,以查找logback-classic依赖为例:

方式一:通过中央仓库搜索

  1. 打开Maven中央仓库官网(https://mvnrepository.com/

  2. 在搜索框输入"logback-classic",点击搜索

  3. 在搜索结果中选择对应版本,复制其坐标配置

方式二:通过IDEA工具搜索

  1. 在pom.xml的<dependencies>标签内,输入<dependency>后按快捷键提示

  2. 在搜索框输入依赖名称(如logback-classic),选择对应依赖及版本,IDEA会自动补全坐标配置

方式三:熟练使用后的快速导入

对于常用依赖,可直接手动编写坐标配置,无需搜索工具辅助

4.1.3 依赖传递

在pom.xml中配置某个依赖后,通过IDEA右侧的Maven面板会发现,除了配置的依赖外,还会引入多个其他依赖,这是Maven的依赖传递特性导致的。

依赖传递定义:若Maven项目A依赖B,B依赖C,C依赖D,则A项目会自动引入B、C、D的依赖,即依赖会逐级传递。

若传递下来的依赖在项目开发中无需使用,可通过"排除依赖"功能将其移除。

4.1.4 排除依赖

排除依赖指主动断开某个传递依赖的资源,被排除的资源无需指定版本。配置方式如下(以排除spring-context依赖传递的micrometer-observation为例):

XML 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>6.1.4</version>

    <!--排除依赖, 主动断开依赖的资源-->
    <exclusions>
        <exclusion>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-observation</artifactId>
        </exclusion>
    </exclusions>
</dependency>

排除依赖示例效果:

1.默认情况下,通过依赖传递会引入micrometer-observation依赖

2.添加排除依赖配置后,micrometer-observation依赖会被移除

4.2 Maven生命周期

4.2.1 生命周期介绍

Maven的生命周期是对项目构建过程的抽象和统一,描述了一次项目构建需经历的所有阶段。在Maven出现前,不同项目的构建流程不统一,手动完成构建操作繁琐且易出错。

Maven总结了一套通用的、易扩展的项目构建生命周期,包含清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等所有构建步骤。

Maven将项目构建生命周期划分为3套相互独立的生命周期:

  • clean:清理工作,用于移除上一次构建生成的文件
  • default:核心工作,包含编译、测试、打包、安装、部署等核心构建步骤
  • site:生成报告、发布站点等辅助工

每套生命周期包含多个有序的阶段(phase),后续阶段依赖于前面阶段的完成。开发中常用的生命周期阶段:

  • clean:移除上一次构建生成的文件(如target目录)
  • compile:编译项目源代码,生成class文件
  • test:使用单元测试框架(如JUnit)运行测试用例
  • package:将编译后的文件打包为jar、war等格式的归档文件
  • install:将打包后的归档文件安装到本地仓库,供其他项目依赖

重要说明:

  • Maven生命周期本身是抽象的,不执行具体构建操作,实际任务由对应的插件完成(如编译由compiler插件完成,打包由jar插件完成)
  • IDEA右侧的Maven工具栏提供了生命周期的快速访问通道,可直接点击执行对应阶段
  • 生命周期的顺序是:clean --> validate --> compile --> test --> package --> verify --> install --> site --> deploy

  • 我们需要关注的就是:clean --> compile --> test --> package --> install

4.2.2 生命周期执行方式

日常开发中,执行Maven生命周期有两种常用方式:

方式一:通过IDEA工具执行

  1. 打开IDEA右侧的Maven面板

  2. 展开项目对应的Lifecycle目录,找到需执行的生命周期阶段(如compile、test、package)

  3. 双击该阶段,IDEA会自动执行对应的构建操作

方式二:通过命令行执行

1.打开Maven项目对应的磁盘目录(如E:\web-project01\maven-project01)

2.在当前目录下打开CMD命令提示符(按住Shift键+右键,选择"在此处打开命令窗口")

输入对应的Maven命令,按回车执行:

  • mvn compile:执行编译阶段
  • mvn test:执行测试阶段(会先执行compile阶段)
  • mvn package:执行打包阶段(会先执行compile、test阶段)
  • mvn install:执行安装阶段(会先执行compile、test、package阶段)
  • mvn clean:执行清理阶段

五、单元测试

测试是验证软件正确性、完整性、安全性和质量的核心过程。单元测试作为最基础的测试阶段,针对软件的最小功能单元(方法)进行测试,是开发人员保障代码质量的重要手段。本节将讲解单元测试的基础概念及基于JUnit框架的单元测试实现。

5.1 测试基础概念

5.1.1 测试阶段划分

软件测试按阶段可分为单元测试、集成测试、系统测试、验收测试,各阶段特点如下:

    1. 单元测试
  • 介绍:对软件的基本组成单位(如方法、类)进行测试,是最小测试单元
  • 目的:检验软件基本组成单位的正确性
  • 测试人员:开发人员
    1. 集成测试
  • 介绍:将已通过单元测试的模块,按设计要求组合成系统或子系统后进行的测试
  • 目的:检查模块之间的协作是否正确
  • 测试人员:开发人员
    1. 系统测试
  • 介绍:对已集成好的软件系统进行全面、彻底的测试
  • 目的:验证软件系统的正确性、性能是否满足需求规格说明书的要求
  • 测试人员:专业测试人员
    1. 验收测试
  • 介绍:交付前的正式测试,针对用户需求、业务流程进行验证
  • 目的:验证软件系统是否满足验收标准,是否可交付给用户使用
  • 测试人员:客户/需求方

5.1.2 测试方法分类

常用的测试方法包括白盒测试、黑盒测试和灰盒测试:

    1. 白盒测试
  • 特点:清楚软件内部结构、代码逻辑
  • 用途:验证代码逻辑的正确性,常用于单元测试
    1. 黑盒测试
  • 特点:不清楚软件内部结构、代码逻辑,仅关注输入输出结果
  • 用途:验证软件功能、兼容性等,常用于系统测试、验收测试
    1. 灰盒测试
  • 特点:结合白盒测试和黑盒测试的特点,既关注软件内部结构,也考虑外部功能表现
  • 用途:适用于集成测试等中间阶段测试

5.2 JUnit入门

5.2.1 JUnit简介

单元测试是针对最小功能单元(方法)编写测试代码验证其正确性的过程。JUnit是最流行的Java单元测试框架之一,由第三方公司提供,可简化单元测试的编写和执行流程。

传统测试方式(main方法测试)的问题:

在JavaSE阶段,我们通常在main方法中编写测试代码,验证程序运行结果。

这种方式存在明显缺陷:

    1. 测试代码与源代码混合在一起,难以维护
    1. 一个方法测试失败会影响后续方法的执行
    1. 无法实现自动化测试,也无法生成测试报告

JUnit框架的优势:

    1. 测试代码与源代码分离(测试代码放在test目录),便于维护
    1. 支持单个测试方法独立执行,不影响其他方法
    1. 可实现自动化测试,自动分析测试结果并生成测试报告

5.2.2 JUnit入门程序

需求:使用JUnit框架对UserService中的getAge方法进行单元测试,验证其正确性。

实现步骤:

步骤1:引入JUnit依赖

在Maven项目的pom.xml文件中,添加JUnit的依赖配置(以JUnit 5为例):

XML 复制代码
<!--Junit单元测试依赖-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

点击刷新按钮,确保依赖成功导入。

步骤2:编写测试类和测试方法

  1. 在test/java目录下,创建与main/java中对应的包结构(如com.itheima)
  1. 在该包下创建测试类,命名规范为"被测试类名+Test"(如UserServiceTest)
  1. 在测试类中编写测试方法,命名规范为"test+被测试方法名"(如testGetAge),方法需满足:public修饰、无返回值、无参数
  1. 在测试方法上添加@Test注解,标识该方法为JUnit测试方法
  1. 编写测试代码,调用被测试方法并验证结果

测试代码示例:

java 复制代码
package org.example;

import org.junit.jupiter.api.Test;

public class UserServiceTest {
    
    @Test
    public void testGetAge(){
        Integer age = new UserService().getAge("110002200505091218");
        System.out.println(age);
    }
}

步骤3:运行单元测试

在IDEA中运行测试方法的方式:

    1. 点击测试方法左侧的运行按钮,选择"Run 'testGetAge()'"
    1. 观察运行结果:测试通过时显示绿色,测试失败时显示红色

注意事项:

  • 测试类命名规范:XxxxTest(如UserServiceTest)
  • 测试方法命名规范:public void xxx()(通常为test+被测试方法名,如testGetAge)

5.3 断言

JUnit提供了一些辅助方法,用来帮我们确定被测试的方法是否按照预期的效果正常工作,这种方式称为断言

示例演示:

java 复制代码
package org.example;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class UserServiceTest {
    
    @Test
    public void testGetAge2(){
        Integer age = new UserService().getAge("110002200505091218");
        Assertions.assertNotEquals(18, age, "两个值相等");
//        String s1 = new String("Hello");
//        String s2 = "Hello";
//        Assertions.assertSame(s1, s2, "不是同一个对象引用");
    }

    @Test
    public void testGetGender2(){
        String gender = new UserService().getGender("612429198904201611");
        Assertions.assertEquals("男", gender);
    }
}

测试结果输出:

5.4 常见注解

在JUnit中还提供了一些注解,还增强其功能,常见的注解有以下几个:

示例代码,演示@BeforeEach@AfterEach@BeforeAll@AfterAll 注解:

java 复制代码
public class UserServiceTest {

    @BeforeEach
    public void testBefore(){
        System.out.println("before...");
    }

    @AfterEach
    public void testAfter(){
        System.out.println("after...");
    }

    @BeforeAll //该方法必须被static修饰
    public static void testBeforeAll(){ 
        System.out.println("before all ...");
    }

    @AfterAll //该方法必须被static修饰
    public static void testAfterAll(){
        System.out.println("after all...");
    }

    @Test
    public void testGetAge(){
        Integer age = new UserService().getAge("110002200505091218");
        System.out.println(age);
    }
    
    @Test
    public void testGetGender(){
        String gender = new UserService().getGender("612429198904201611");
        System.out.println(gender);
    }
 }   

输出结果如下:

示例代码,演示@ParameterizedTest @ValueSource@DisplayName 注解:

java 复制代码
package org.example;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

@DisplayName("测试-学生业务操作")
public class UserServiceTest {

    @DisplayName("测试-获取年龄")
    @Test
    public void testGetAge(){
        Integer age = new UserService().getAge("110002200505091218");
        System.out.println(age);
    }

    @DisplayName("测试-获取性别")
    @Test
    public void testGetGender(){
        String gender = new UserService().getGender("612429198904201611");
        System.out.println(gender);
    }

    @DisplayName("测试-获取性别3")
    @ParameterizedTest
    @ValueSource(strings = {"612429198904201611","612429198904201631","612429198904201626"})
    public void testGetGender3(String idcard){
        String gender = new UserService().getGender(idcard);
         System.out.println(gender);
    }
}

输出结果如下:

5.5 依赖范围

依赖的jar包,默认情况下,可以在任何地方使用,在main目录下,可以使用;在test目录下,也可以使用。

在maven中,如果希望限制依赖的使用范围,可以通过 <scope>...</scope> 设置其作用范围。

作用范围:

  • 主程序范围有效。(main文件夹范围内)

  • 测试程序范围有效。(test文件夹范围内)

  • 是否参与打包运行。(package指令范围内)

可以在pom.xml中配置 <scope></scope> 属性来控制依赖范围。

如果对Junit单元测试的依赖,设置了scope为 test,就代表,该依赖,只是在测试程序中可以使用,在主程序中是无法使用的。所以我们会看到如下现象:

如上图所示,给junit依赖通过scope标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。

scope的取值常见的如下:

相关推荐
专注API从业者1 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠1 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY1 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克32 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠3 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌3 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局3 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化
阿丰资源3 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
呱牛do it3 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 8)
java
消失的旧时光-19434 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解