day65(SpringBoot1:基于Spring的测试,@Sql注解,断言,关于Spring Boot,创建工程,结构,使用mybatis,关于profile配置)
day65(SpringBoot1:基于Spring的测试,@Sql注解,断言,关于Spring Boot,创建工程,结构,使用mybatis,关于profile配置)
1.基于Spring的测试
Spring Test
1.Spring Test主要解决了以下问题:
- 在普通测试环境下,当需要使用Spring时,需要手动加载Spring配置,且手动从Spring容器中获取对象,使用Spring Test后,只需要通过注解指定Spring配置类,在Spring容器中的对象均可自动装配
- 通过@Sql等注解,对数据库编程的测试提供了更好的支持
2.使用
-
使用Spring Test时需添加的依赖项为:spring-test
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.14</version> </dependency>
-
注意:你仍需另外添加测试的依赖项
-
注意:需要与其它的spring-???依赖项使用完全相同的版本
-
在编写测试时,在测试类上添加@SpringJUnitConfig注解,并在此注解中配置Spring的配置类作为参数,则执行此类的任何测试方法之前,都会加载这些Spring配置类,并且,在编写测试时,只要是在Spring容器中存在的对象,都可以自动装配
-
例如:
@SpringJUnitConfig(SpringConfig.class) public class MybatisSpringTests { @Autowired Environment env; @Test public void contextLoads() { System.out.println(env.getProperty("datasource.url")); System.out.println(env.getProperty("datasource.driver")); System.out.println(env.getProperty("datasource.username")); System.out.println(env.getProperty("datasource.password")); } }
2.@Sql注解
1.使用方法
- 当添加了spring-test依赖后,可以在测试时使用@Sql注解,以加载某些.sql脚本,使得测试之前或之后将执行这些脚本!
2.解决的问题:
- 使用此注解主要是为了保障可以反复测试,并且得到预期的结果!例如执行删除的测试时,假设数据是存在的,第1次删除可以成功,但是在这之后的测试将不会成功,因为数据在第1次测试时就已经被删除!则可以编写一个.sql脚本,通过脚本向数据表中插入数据,并在每次测试之前执行此脚本,即可保证每次测试都是成功的!
- 此注解可以添加在测试类上,则对当前测试类的每个测试方法都是有效的
- 此注解也可以添加在测试方法上,则只对当前测试方法是有效的
- 如果测试类和测试方法上都添加了此注解,则仅测试方法上的注解会生效
- 此注解除了配置需要执行的.sql脚本以外,还可以通过executionPhase属性配置其执行阶段,例如取值为 Sql.ExecutionPhase.AFTER_TEST_METHOD时将使得.sql脚本会在测试方法之后被执行
- 每个测试方法可以添加多个@Sql注解
3.举例
-
例如:
@Test @Sql(scripts = {"classpath:truncate.sql" , "classpath:insert_data.sql"})@Sql(scripts = {"classpath:truncate.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) public void testDeleteByIdSuccessfully() { Long id = 1L; int rows = adminMapper.deleteById(id); Assertions.assertEquals(1, rows); }
-
insert_data.sql脚本示例:
insert into ams_admin (username, password) values ('admin001','123456'); insert into ams_admin (username, password) values ('admin002','123456'); insert into ams_admin (username, password) values ('admin003','123456'); insert into ams_admin (username, password) values ('admin004','123456'); insert into ams_admin (username, password) values ('admin005','123456');
-
truncate.sql脚本示例:
truncate ams_admin;
3.断言
- 断言,如同中文的字面意思,可以理解为“一口咬定”,在测试中,表现为预判测试结果
- 在执行测试时,应该使用断言对测试结果进行预判,而不是使用输出语句结合肉眼观察结果,这样才更符合自动化测试的标准(在自动化测试中,可以一键执行项目中的所有测试方法,并将测试结果汇总到专门的测试报告文件中)
- 提示:断言并不是Spring系列框架的功能,而是测试框架的功能
- 通过调用Assertions类中的静态方法可以对测试结果进行断言,常用方法有:
- assertEquals():断言匹配(相等)
- assertNotEquals():断言不匹配(不相等)
- assertTrue():断言为“真”
- assertFalse():断言为“假”
- assertNull():断言为null
- assertNotNull():断言不为null
- assertThrows():断言将抛出异常
- assertDoesNotThrow():断言不会抛出异常
- 其它
4. 关于Spring Boot
Spring Boot是Spring官方的一个产品,其本质上是一个基于Maven的、以Spring框架作为基础的进阶框架,很好的支持了主流的其它框架,并默认完成了许多的配置,其核心思想是“约定大于配置”。
5. 创建Spring Boot工程
在IntelliJ IDEA中,在创建向导中选择Spring Initializer即可开始创建Spring Boot工程,在创建向导的界面中,需要关注的部分有:
- Group Id
- Artifact Id
以上2个值会共同构成一个Package name,如果Artifact Id的名字中有减号,在Package name中会去除,推荐手动添加小数点进行分隔。
由于Spring Boot官方更新版本的频率非常高,在创建项目时,随便选取某个版本均可,当项目创建成功后,推荐打开pom.xml
,将<parent>
中的<version>
(即Spring Boot父项目的版本)改成熟悉的版本,例如:2.5.9
在创建过程中,还可以在创建向导的界面中勾选所需要依赖项,如果创建时没有勾选,也可以在创建工程之后手动在pom.xml
中添加。
6. Spring Boot工程的结构
由于Spring Boot工程本质上就是一个Maven工程,所以,目录结构基本上没有区别。
与普通Maven工程最大的不同在于:Spring Boot工程在src\main\java
和src\test\java
下默认已经存在Package,是创建项目时指定的Package,需要注意:此Package已经被配置为Spring执行组件扫描的根包,所以,在编写代码时,所有的组件类都必须放在此包或其子孙包中!通常,推荐将所有的类(及接口)都创建在此包及其子孙包下。
在src\main\java
下的根包下,默认就已经存在某个类,其类名是创建项目时指定的Artifact与Application
单词的组合,例如BootDemoApplication
,此类中有main()
方法,执行此类的main()
就会启动整个项目,如果当前项目是Web项目,还会自动将项目部署到Web服务器并启动服务器,所以,此类通常也称之为“启动类”。
在启动类上,默认添加了@SpringBootApplication
注解,此注解的元注解中包含@SpringBootConfiguration
,而@SpringBootConfiguration
的元注解中包含@Configuration
,所以,启动类本身也是配置类!所以,允许将@Bean
方法写在此类中,或者某些与配置相关的注解也可以添加在此类上!
在src\test\java
下的根包下,默认就已经存在某个类,其类名是在启动类的名称基础上添加了Tests
单词的组合,例如BootDemoApplicationTests
,此类默认没有添加public
权限,甚至其内部的默认的测试方法也是默认权限的,此测试类上添加了@SpringBootTest
注解,其元注解中包含@ExtendWith(SpringExtension.class)
,与使用spring-test
时的@SpringJUnitTest
注解中的元注解相同,所以,@SpringBootTest
注解也会使得当前测试类在执行测试方法之前是加载了Spring环境的,在实际编写测试时,可以通过自动装配得到任何已存在于Spring容器中的对象,在各测试方法中只需要关注被测试的目标即可。
在pom.xml
中,默认已经添加了spring-boot-starter
和spring-boot-starter-test
依赖,分别是Spring Boot的基础依赖和基于Spring Boot的测试的依赖。
另外,如果在创建工程时,勾选依赖项时选中了Web
项,在src\main\resources
下默认就已经创建了static
和templates
文件夹,如果没有勾选Web
则没有这2个文件夹,可以后续自行补充创建。
在src\main\resources
文件夹下,默认就已经存在application.properties
文件,用于编写配置,Spring Boot会自动读取此文件(利用@PropertySource
注解)。
小结:
- 创建项目后默认的Package不要修改,避免出错
- 在编码过程中,自行创建的所有类、接口均放在默认的Package或其子孙包中
- 在
src\main\java
下默认已存在XxxApplication
是启动类,执行此类中的main()
方法就会启动整个项目 - 启动类本身也是配置类
- 配置都应该编写到
src\main\resources
下的application.properties
中,Spring Boot会自动读取 - 测试类也必须放在
src\test\java
下的默认Package或其子孙包中 - 在测试类上添加
@SpringBootTest
注解,则其中的测试方法执行之前会自动加载Spring环境及当前项目的配置,可以在测试类中使用自动装配
7. 在Spring Boot工程中使用Mybatis
需要添加相关依赖项:
mysql-connector-java
mybatis-spring-boot-starter
其依赖的代码为:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
说明:在Spring Boot工程,许多依赖项都是不需要显式的指定版本号的,因为在父项目中已经对这些依赖项的版本进行了管理(配置版本号),如果一定需要使用特定的版本,也可以自行添加<version>
节点进行配置
说明:在依赖项的源代码中,当<scope>
的值为runtime
时,表示此依赖项是运行过程中需要的,但是,在编译时并不需要参与编译
需要注意:当添加了以上数据库编程的依赖后,如果启动项目,将失败!
因为添加了数据库编程的依赖项后,Spring Boot就会尝试自动装配数据源(DataSource
)等对象,装配时所需的连接数据库的配置信息(例如URL、登录数据库的用户名和密码)应该是配置在application.properties
中的,但是,如果尚未配置,就会导致失败!
关于连接数据库的配置信息,Spring Boot要求对应的属性名是:
# 连接数据库的URL
spring.datasource.url=???
# 登录数据库的用户名
spring.datasource.username=???
# 登录数据库的密码
spring.datasource.password=???
在配置时,也必须使用以上属性名进行配置,则Spring Boot会自动读取这些属性对应的值,用于创建数据源对象!
例如,配置为:
# 连接数据库的URL
spring.datasource.url=jdbc:mysql://localhost:3306/mall_ams?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 登录数据库的用户名
spring.datasource.username=root
# 登录数据库的密码
spring.datasource.password=1234
由于Spring Boot在启动时只是加载以上配置,并不会实际的连接到数据库,所以,当以上配置存在时,启动就不会报错,但是,无法检验以上配置的值是否正确!
可以在测试类中添加测试方法,尝试连接数据库,以检验以上配置值是否正确:
@SpringBootTest
class BootDemoApplicationTests {
@Autowired
DataSource dataSource;
@Test
void testGetConnection() throws Exception {
System.out.println(dataSource.getConnection());
}
}
如果以上测试通过,则表示配置值无误,可以正确连接到数据库,如果测试失败,则表示配置值错误,需检查配置值及本地环境(例如MySQL是否启动、是否已创建对应的数据库等)。
8. 关于Profile配置
在Spring Boot中,对Profile配置有很好的支持,开发人员可以在src\main\resources
下创建更多的配置文件,这些配置文件的名称应该是application-???.properties
(其中的???
是某个名称,是自定义的)。
例如:
- 仅在开发环境中使用的配置值可以写在
application-dev.properties
中 - 仅在测试环境中使用的配置值可以写在
application-test.properties
中 - 仅在生产环境(项目上线的环境)中使用的配置值可以写在
application-prod.properties
中
当把配置写在以上这类文件后,Spring Boot默认并不会应用以上这些文件中的配置,当需要应用某个配置时,需要在application.properties
中激活某个Profile配置,例如:
# 激活Profile配置
spring.profiles.active=dev
提示:以上配置值中的dev
是需要激活的配置文件的文件名后缀,当配置为dev
时,就会激活application-dev.properties
,同理,如果以上配置值为test
,就会激活application-test.properties
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!