文章目录
- 一、Spring-Boot单元测试(了解)
-
- 1.1 概念
- 1.2 单元测试引用
- 1.3 单元测试的实现
- 1.4 简单的断言说明
- 1.5 单元测试优点
- 二、Mybatis 增,删,改 操作
-
- 2.1 增加⽤户操作
- 2.2 修改⽤户操作
- 2.3 删除⽤户操作
一、Spring-Boot单元测试(了解)
1.1 概念
-
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类
-
单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。执行单元测试,就是为了证明这段代码的行为和我们期望是否一致
1.2 单元测试引用
使用单元测试需要引入依赖,一般框架都已经自动注入了该依赖 !!
原理:
通过spring initialize创建的Spring Boot项目会在Maven中自动携带很多starter依赖,而其中就存在该测试依赖 !
1.3 单元测试的实现
- 生成单元测试的类
在接口层中,右击鼠标点击Generate选择Test
以下就生成了该接口的测试类,并有接口中声明方法对应的测试方法
- 配置单元测试的类
添加 @SpringBootTest 注解,再添加业务代码
//1、必须添加以下注解:该注解表示,以下测试单元代码 是在 Spring 中运行的
@SpringBootTest
@Slf4j
class UserInfoMapperTest {
//2、添加需要测试单个功能的代码
@Resource
private UserInfoMapper userInfoMapper;
@Test
void getUserById() {
UserInfo userInfo = userInfoMapper.getUserById(1);
// System.out.println(userInfo); 此时只是打印结果,无论代码是否错误,单元测试都会通过
//以下 使用断言 来检测单元测试结果 ! 我们可以 设置 id 为确实存在于数据库的,如果测试单元不通过就说明上述功能代码存在问题
//通过功能代码查询到的对象结果 和 Null 进行对比(还有很多其他方法,结果和True对比等),如果不为空的话,单元测试就会成功
Assertions.assertNotNull(userInfo);
}
注意:
-
必须添加 @SpringBootTest 注解:该注解表示,以下测试单元代码 是在 SpringBoot中运行的
-
如果使用的是科学版IDEA,在Test测试代码中使用 @Autowired 注入注解会报错因为:@Mapper来自mybatis框架,而@Autowired 来自 spring,没有兼容性。而使用JDK官方的@Resource可以
1.4 简单的断言说明
使用方法如上述代码 !
1.5 单元测试优点
上述内容只是大概认识了解下单元测试,详细内容参考这里 !
二、Mybatis 增,删,改 操作
在前面我们已经创建了第一个 mybatis 项目,并完成了简单的查询操作!后续执行的增删改操作大体步骤相似,需要更改 xml 文件中部分标签,下面我们就来学习 !
下面示例为了方便,我们就不依次完成各层书写,只需要把接口层补充完整,并完成 xml 文件的代码,再通过单元测试来验证结果 !!
注意:如果你不想破坏数据库的数据,可以使用 注解 @Transaction 进行事务回滚
2.1 增加⽤户操作
mapper 接口层实现:
package com.example.demo.mapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserInfoMapper {
public int addUser(UserInfo userInfo);
}
相应的 xml 文件实现为:
?xml version="1.0" encoding="UTF-8"?>
!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
!--namespace 需要实现的接口的具体包名加接口名-->
mapper namespace="com.example.demo.mapper.UserInfoMapper">
!-- 添加用户 此时#{}获取的参数,就是用户表中对应的属性-->
insert id="addUser">
insert into userinfo(username, password, photo)
values (#{username}, #{password}, #{photo})
/insert>
/mapper>
生成对应的单元测试代码:
@Test
void addUser() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("guishao");
userInfo.setPassword("526398");
userInfo.setPhoto("default");
int result = userInfoMapper.addUser(userInfo);
Assertions.assertEquals(1,result);
}
运行该测试方法,并观察结果:
查看数据库数据:
显而易见,我们成功的添加了一个用户 !!
特殊的添加:返回⾃增 id
xml 文件中的代码实现如下:
!-- 添加用户 返回受影响的行数和自增id ! useGeneratedKeys:表示是否开起id自增
keyProperty:将自增的id值赋值给实体对象的哪个属性 keyColumn:将自增的id赋值给数据库中的哪一个字段-->
insert id="addUser1" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into userinfo(username, password, photo)
values (#{username}, #{password}, #{photo})
/insert>
标签说明:
- useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据
库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递
增字段),默认值:false - keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列
不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性
名称 - keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值
或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset),如果⽣成列不⽌
⼀个,可以⽤逗号分隔多个属性名称
2.2 修改⽤户操作
mapper 接口层实现:
package com.example.demo.mapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserInfoMapper {
public int updateUserById(@Param("id") Integer ID,@Param("username") String Name);
}
相应的 xml 文件实现为:
?xml version="1.0" encoding="UTF-8"?>
!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
!--namespace 需要实现的接口的具体包名加接口名-->
mapper namespace="com.example.demo.mapper.UserInfoMapper">
!--根据用户id 修改 姓名-->
update id="updateUserById">
update userInfo
set username = #{username}
where id = #{id};
/update>
/mapper>
生成对应的单元测试代码:
如:修改id=42的用户名为 goodman
@Test
void updateUserById() {
int result = userInfoMapper.updateUserById(42,"goodman");
Assertions.assertEquals(1,result);
}
查看数据库:
显而易见,我们成功修改了用户姓名 !!
2.3 删除⽤户操作
mapper 接口层实现:
package com.example.demo.mapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserInfoMapper {
public int delUserById(@Param("id") Integer ID);Name);
}
相应的 xml 文件实现为:
?xml version="1.0" encoding="UTF-8"?>
!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
!--namespace 需要实现的接口的具体包名加接口名-->
mapper namespace="com.example.demo.mapper.UserInfoMapper">
!--根据用户id 删除 用户-->
delete id="delUserById">
delete
from userinfo
where id = #{id}
/delete>
/mapper>
生成对应的单元测试代码:
如删除数据库 id=42 的用户信息
@Test
void delUserById() {
int result = userInfoMapper.delUserById(42);
Assertions.assertEquals(1,result);
}
查看数据库:
显而易见,我们成功的删除了 id=42 的用户信息 !!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net