Javaweb学习笔记——Maven

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、依赖管理

依赖项可以在以下网站中寻找:

https://mvnrepository.com/

点击第一个的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

进行统一删除

之后把项目关了重新打开即可!!!

相关推荐
d111111111d2 小时前
STM32-HAL库学习,初识HAL库
笔记·stm32·单片机·嵌入式硬件·学习
AAA阿giao2 小时前
从树到楼梯:数据结构与算法的奇妙旅程
前端·javascript·数据结构·学习·算法·力扣·
Sunniering2 小时前
使用classfinal-maven-plugin加密 Spring Boot JAR 包配置流程
spring boot·maven·jar·classfinal插件
Roxanne0072 小时前
吴教授《AI for everyone》笔记梳理(DAY1)
人工智能·笔记
zsyy@2 小时前
Maven本地仓库有jar还会向远程仓库下载依赖的问题
java·服务器·maven
头疼的程序员2 小时前
计算机网络:自顶向下方法(第七版)第一章 学习分享
网络·学习·计算机网络
先生沉默先2 小时前
c#Socket学习,使用Socket创建一个在线聊天,数据模型(2)
服务器·学习·c#
初来乍到到2 小时前
elementUI表格tableixed=“right“ 导致固定列错位的解决方法
笔记
计算机毕设指导62 小时前
基于微信小程序的个性化服装搭配推荐系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea