创建空项目之后,先选择空项目的 jdk 和 jdk语言版本。
以下图中所有的位置都要相同版本
xml文件中的坐标
资源(jar包)的唯一标识,通过坐标可以定位到所需资源(jar包)位置。
坐标的组成部分
- groupId: 组织名(域名反写)
- arfitactId: 模块名
- Version: 版本号
Maven仓库作用与分类
作用:存储资源,管理各种jar包
- 本地仓库:自己计算机上的一个目录(用来存储jar包)
- 中央仓库:由Maven团队维护的全球唯一的。仓库地址:repo1.maven.org/maven2/
- 远程仓库(私服):一般由公司团队搭建的私有仓库
查询顺序:本地仓库 --> 远程仓库--> 中央仓库
Maven常用的生命周期
- clean:移除上一次构建生成的文件(clean与下列命令不在同一套生命周期)
- compile:编译项目源代码
- test:使用合适的单元测试框架运行测试(junit)
- package:将编译后的文件打包,如:jar、war等
- install:安装项目到本地仓库
测试
- 测试:是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
- 阶段划分:单元测试、集成测试、系统测试、验收测试。
- 测试方法:白盒测试、黑盒测试及灰盒测试。
JUnit单元测试
-
在pom.xml中,引入JUnit的依赖
-
在test/java目录下,创建测试类,并编写对应的测试方法,并在方法上声明aTest注解
-
运行单元测试(测试通过:绿色;测试失败:红色)
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
JUnit单元测试的命名规范
- 类:XxxxTest(规范)
- 方法:public void xxxx(){...}(规定)
AI可生成单元测试
JUnit常用注解
| 注解 | 描述 | 用途 |
|---|---|---|
@Test | 测试类中的方法用它修饰才能成为测试方法,才能启动执行 | 单元测试 |
@ParameterizedTest | 参数化测试的注解(可以让单个测试运行多次,每次运行时仅参数不同) | 用了该注解,就不需要 @Test 注解了 |
@ValueSource | 参数化测试的参数来源,赋予测试方法参数 | 与参数化测试注解配合使用 |
@DisplayName | 指定测试类、测试方法显示的名称(默认为类名、方法名) | 用于自定义测试名称 |
断言
JUnit提供了一些辅助方法,用来帮我们确定被测试的方法是否按照预期的效果正常工作,这种方式称为断言。
| 断言方法 | 描述 |
|---|---|
assertEquals(Object exp, Object act, String msg) | 检查两个值是否相等,不相等就报错。 |
assertNotEquals(Object unexp, Object act, String msg) | 检查两个值是否不相等,相等就报错。 |
assertNull(Object act, String msg) | 检查对象是否为null,不为null,就报错。 |
assertNotNull(Object act, String msg) | 检查对象是否不为null,为null,就报错。 |
assertTrue(boolean condition, String msg) | 检查条件是否为true,不为true,就报错。 |
assertFalse(boolean condition, String msg) | 检查条件是否为false,不为false,就报错。 |
assertSame(Object exp, Object act, String msg) | 检查两个对象引用是否相等,不相等,就报错。 |
JUnit实例
public class UserService {
public UserService() {}
public Integer getAge(String id) {
if("110110200005050308".equals(id)){
return 19;
}else if("110110200005050328".equals(id)){
return 24;
}else if("110110200005050388".equals(id)){
return 59;
}
return -1;
}
public String getGender(String id) {
if("110110200005050308".equals(id)){
return "男";
}else if("110110200005050328".equals(id)){
return "女";
}else if("110110200005050388".equals(id)){
return "男";
}
return "id不存在";
}
}
@DisplayName("用户信息测试类")
public class UserService1Test {
//修饰实例方法,每一个测试方法运行之前都会执行一次
@BeforeEach
public void beforeEach(){
System.out.println("beforeEach....");
}
//修饰实例方法,每一个测试方法运行之后都会执行一次
@AfterEach
public void afterEach(){
System.out.println("afterEach....");
}
//修饰静态方法,所有测试方法运行之前只执行一次
@BeforeAll
public static void beforeAll(){
System.out.println("beforeAll....");
}
//修饰静态方法,所有测试方法运行之后只执行一次
@AfterAll
public static void afterAll(){
System.out.println("afterAll....");
}
//定义一个测试方法
@DisplayName("测试获取年龄1")
@Test
public void testGetAge(){
UserService userService = new UserService();
System.out.println(userService.getAge("110110200005050308"));
}
//定义一个测试方法 - 断言 --- 110110200005050308
@DisplayName("测试获取年龄2")
@Test
public void testGetAge2(){
UserService userService = new UserService();
Assertions.assertEquals(24,userService.getAge("110110200005050308"),"测试失败");
}
//定义一个测试方法 - 断言 --- 110110200005050308
@DisplayName("测试获取性别1")
@Test
public void testGetGender(){
UserService userService = new UserService();
Assertions.assertEquals("女",userService.getGender("110110200005050308"),"测试失败");
}
//参数化测试 --- 110110200005050308 110110200005050328 110110200005050388
@DisplayName("测试获取性别2")
@ParameterizedTest
@ValueSource(strings = {"110110200005050308","110110200005050328","110110200005050388"})
public void testAbc2(String idCard){
UserService userService = new UserService();
Assertions.assertEquals("女",userService.getGender(idCard),"测试失败");
}
}
Maven常见问题
问题现象:Maven项目中添加的依赖,未正确下载,造成右侧Maven面板中的依赖报红,再次reload重新加载也不会再下载。
产生原因:由于网络原因,依赖没有下载完整导致的,在maven仓库中生成了xxx.lastUpdated文件,该文件不删除,不会再重新下载。
解决方法:在maven仓库中,通过依赖文件的坐标,找到对应的文件进行删除,回到项目重新加载即可。