【 SpringBoot单元测试 和 Mybatis 增,删,改 操作 】

一、Spring-Boot单元测试(了解)

1.1 概念

  1. 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类

  2. 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。执行单元测试,就是为了证明这段代码的行为和我们期望是否一致

1.2 单元测试引用

使用单元测试需要引入依赖,一般框架都已经自动注入了该依赖 !!

在这里插入图片描述

原理:

通过spring initialize创建的Spring Boot项目会在Maven中自动携带很多starter依赖,而其中就存在该测试依赖 !

在这里插入图片描述

1.3 单元测试的实现

  1. 生成单元测试的类
    在接口层中,右击鼠标点击Generate选择Test
    在这里插入图片描述

在这里插入图片描述

以下就生成了该接口的测试类,并有接口中声明方法对应的测试方法

在这里插入图片描述

  1. 配置单元测试的类
    添加 @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);
    }

注意:

  1. 必须添加 @SpringBootTest 注解:该注解表示,以下测试单元代码 是在 SpringBoot中运行的

  2. 如果使用的是科学版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>

标签说明:

  1. useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据
    库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递
    增字段),默认值:false
  2. keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列
    不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性
    名称
  3. 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 的用户信息 !!


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在进行单元测试时,如果依赖于flyway,你需要在项目的pom.xml文件中添加flyway的依赖项。具体的依赖项配置为: ```xml <!--引入flywaydb--> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> ``` 这样就可以在单元测试中使用flyway来进行数据库迁移的操作了。同时,在单元测试中使用flyway的好处包括: 1. 可以简单、直观、快速地测试某个功能是否正确。 2. 在打包之前,通过单元测试可以发现一些问题,因为在打包之前,必须保证所有的单元测试都通过。 3. 使用单元测试可以在不污染数据库的情况下测试功能,即在不对数据库进行任何变的情况下进行测试。 然而,有时候在使用@SpringBootTest注解时可能会遇到问题,比如报错"Flyway Validate failed:migration checksum mismatch"。这是因为@SpringBootTest注解会启动整个应用的环境,包括flyway的自动配置,而你又重复了这个动作,导致出错。解决这个问题的方法是在配置文件中设置flyway.enable=false,禁止flyway的自动装配。 总之,配置flyway的单元测试需要添加flyway的依赖项,并注意@SpringBootTest注解可能会导致一些问题,需要进行适当的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [微服务SpringCloud的单元测试+flyway配置](https://blog.csdn.net/qq_42378874/article/details/106588957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MyBatisMyBatis增删改查操作单元测试】](https://blog.csdn.net/m0_59735420/article/details/128160380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [使用mybatis+h2+flyway进行单元测试](https://blog.csdn.net/ljm_csdn/article/details/80500936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值