1、Maven的概述




2、maven的安装

Maven下载地址:https://maven.apache.org/download.cgi#CurrentMaven
下载之后解压缩,要将资源放到一个没有中文和空格命名的文件夹下!
之后新建一个目录为 mvn_repo
打开conf的setting.xml在idea中打开,定位到53行

之后到160行左右,将代码中本来的私服地址删除,在注释中写阿里云私服地址,AI自动生成如下(147行开始),不要将末尾的结束标签删除
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<!-- 阿里云的镜像地址 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central/</url>
</mirror>
</mirrors>
在高级系统配置中先新增环境变量,之后在path中也新增这个地址,一定要下载jdk才行,不然无法在cmd中验证这个版本!
jdk17下载地址:https://pan.xunlei.com/s/VNtYf_N6uAnx1itnVSKnh9c-A1?pwd=gd39
要和maven的下载地址放在一起,之后可正常显示
3、IDEA集成
首先进入到idea的欢迎页面,关闭项目即可,否则就不是全局配置

点击所有设置

点击构建工具的Maven以及旁边的主路径选择Maven所在的文件夹
之后重新配置用户设置文件

配置maven下的运行程序,将jdk改为17

将字节码版本设置为17

之后创建一个空项目,并配置项目结构的sdk、语言为17


创建Maven项目:

创建好之后,如果想让test也有resources,可以新创建一个目录

在java处右击新建java类,直接输入com.itheima.helloworld即可自动生成如下内容

之后在类中输入代码:
package com.itheima;
public class helloworld {
public static void main(String[] args) {
System.out.println("hello world!");
}
}
点击绿色箭头即可运行程序:

结果如下:

编译之后自动生成字节码文件和打包好的文件

在pom.xml中下面这段内容表示maven的坐标:

maven的坐标

导入别的maven项目!!!


总结:

4、依赖管理

依赖项可以在以下网站中寻找:
点击第一个的spring-context

进去之后选择6.1.4

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
</dependency>
之后将以上内容复制到文件中,并点击右上角的刷新图标,进行联网下载,下载之后红色字体消失

可以通过这个检查,是否存在这个依赖,没有就刷新一下

由于在下载依赖时,除了指定的资源,还会下载一些其他的,如果不想用其他的依赖,可以对其进行排除,切记,这个要放在dependency的结束标签前!!!


生命周期:点击install的时候前面的都会执行,除了clean


5、单元测试





先导入一个java,进行测试:
package com.itheima;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
public class UserService {
/**
* 给定一个身份证号, 计算出该用户的年龄
* @param idCard 身份证号
*/
public Integer getAge(String idCard){
if (idCard == null || idCard.length() != 18) {
throw new IllegalArgumentException("无效的身份证号码");
}
String birthday = idCard.substring(6, 14);
LocalDate parse = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyyMMdd"));
return Period.between(parse, LocalDate.now()).getYears();
}
/**
* 给定一个身份证号, 计算出该用户的性别
* @param idCard 身份证号
*/
public String getGender(String idCard){
if (idCard == null || idCard.length() != 18) {
throw new IllegalArgumentException("无效的身份证号码");
}
return Integer.parseInt(idCard.substring(16,17)) % 2 == 1 ? "男" : "女";
}
}
步骤:

首先引入依赖:
<!--Junit单元测试依赖-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
之后在test下建立和原软件包一样的名字并创建一个测试类
以下是测试类中的内容:
package com.itheima;
import org.junit.jupiter.api.Test;
public class UserServiceTest {
@Test
public void testGetAge() {
UserService userService = new UserService();
Integer age = userService.getAge("44032419900101001X");
System.out.println(age);
}
}
之后点击这个类左边的三角运行

显示结果如下:

断言:主要因为测试代码只检查语法问题,方法的实际正确性是无法检查的,因此引入断言


第一个是预期值,第二个是实际值
//断言测试
@Test
public void testGetGebderWithAssert(){
UserService userService = new UserService();
String gender = userService.getGender("44032419900101001X");
Assertions.assertEquals("男", gender);
}
只需要看是红色还是绿色,绿色通过,红色未通过

检查异常是否正常
@Test
public void testGetGebderWithAssert2(){
UserService userService = new UserService();
String gender = userService.getGender("44032419900101001X");
Assertions.assertThrows(IllegalArgumentException.class,()->{
userService.getGender(null);
});
}


在测试类方法中添加以下内容:
@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...");
}
结果如下:断言操作没有输出且优先级更高

参数化注解:在valuesource中书写具体要测试的值,之后直接引用传入的参数g即可,点击运行之后,直接测试以下3个数据
//参数化测试
@ParameterizedTest
@ValueSource(strings = {"44032419900101001X","372836498098764731","837290174637283998"})
public void testGetGender2(String g) {
UserService userService = new UserService();
String gender = userService.getGender(g);
Assertions.assertEquals("男", gender);
}

在代码上方添加注解:@DisplayName("测试用户性别"),结果如下:

总结:


通过这个方法可以得到还有一些类没有进行测试

如果想只显示UserService的覆盖率:

选择添加类

选择UserService进行添加,之后再重新运行test即可

结果如下:

之后使用通义进行ai生成单元测试,在market中输入:tongyi,下载安装即可

在userservice中点击通义的标志之后点击生成单元测试即可
新创建一个类用来放ai生成的代码:
package com.itheima;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class UserServiceAiTest {
// 每一个测试方法之前运行一次
@BeforeEach
public void testBefore() {
System.out.println("before...");
}
// 每一个测试方法之后运行一次
@AfterEach
public void testAfter() {
System.out.println("after...");
}
// 所有测试方法运行之前运行一次
@BeforeAll
public static void testBeforeAll() {
System.out.println("before all ...");
}
// 所有测试方法运行之后运行一次
@AfterAll
public static void testAfterAll() {
System.out.println("after all...");
}
@DisplayName("用户信息")
@Test
public void testGetAge() {
UserService userService = new UserService();
Integer age = userService.getAge("44032419900101001X");
System.out.println(age);
}
@Test
public void testGetGender() {
UserService userService = new UserService();
String gender = userService.getGender("44032419900101001X");
System.out.println(gender);
}
// 断言测试
@Test
public void testGetGenderWithAssert() {
UserService userService = new UserService();
String gender = userService.getGender("44032419900101001X");
Assertions.assertEquals("男", gender);
}
@Test
public void testGetGenderWithAssert2() {
UserService userService = new UserService();
String gender = userService.getGender("44032419900101001X");
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender(null);
});
}
// 参数化测试
@DisplayName("测试用户性别")
@ParameterizedTest
@ValueSource(strings = {"44032419900101001X", "372836498098764731", "837290174637283998"})
public void testGetGender2(String g) {
UserService userService = new UserService();
String gender = userService.getGender(g);
Assertions.assertEquals("男", gender);
}
/**
* 测试null输入时抛出异常
*/
@Test
@DisplayName("测试null输入抛出异常")
public void testGetAgeWithNullInput() {
UserService userService = new UserService();
IllegalArgumentException exception = Assertions.assertThrows(
IllegalArgumentException.class,
() -> userService.getAge(null)
);
Assertions.assertEquals("无效的身份证号码", exception.getMessage());
}
/**
* 测试长度不足18位的身份证号
*/
@ParameterizedTest
@ValueSource(strings = {"", "123456789", "12345678901234567", "1234567890123456"})
@DisplayName("测试长度不足18位的身份证号抛出异常")
public void testGetAgeWithShortIdCard(String invalidIdCard) {
UserService userService = new UserService();
IllegalArgumentException exception = Assertions.assertThrows(
IllegalArgumentException.class,
() -> userService.getAge(invalidIdCard)
);
Assertions.assertEquals("无效的身份证号码", exception.getMessage());
}
/**
* 测试长度超过18位的身份证号
*/
@Test
@DisplayName("测试长度超过18位的身份证号抛出异常")
public void testGetAgeWithLongIdCard() {
UserService userService = new UserService();
String tooLongIdCard = "1234567890123456789"; // 19位
IllegalArgumentException exception = Assertions.assertThrows(
IllegalArgumentException.class,
() -> userService.getAge(tooLongIdCard)
);
Assertions.assertEquals("无效的身份证号码", exception.getMessage());
}
}
结果:

6、Maven依赖范围

设置范围,这样就不能在主程序中编写test文件,否则会报错!

总结:

如果由于网络原因导致依赖没有下完整,需要找到仓库中对应的后缀为lastupdated的文件进行删除之后,才能重新下载依赖!!!

在本地仓库那里输入cmd,

之后输入:del /s *.lastUpdated

进行统一删除
之后把项目关了重新打开即可!!!