基于Springboot+Mybatis对数据访问层进行单元测试的方式分享

 更新时间:2023年07月19日 08:21:51   作者:JAVA旭阳  
本文将介绍一种快高效、可复用的解决测试方案——对数据访问层做单元测试,文章通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下

Mybatis测试依赖

我们项目采用的SpringBoot + Mybatis作为开发框架,大家第一想到可以用SpringBoot自带的测试注解@SpringBootTest进行测试。但是使用该注解有一个最大的弊端就是需要启动整个容器,注入全部的bean,那么一次测试就相当于启动一次应用,我们的应用启动一次就要花费近70~80秒,黄花菜都凉了。

那么有没有更好的办法,有必要注入全量的bean吗?是不是只要注入数据访问层相关的bean即可,其实官方的mybatis就给了我们这样的的解决方案。

  • 引入依赖mybatis-spring-boot-starter-test
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter-test</artifactId>
  <version>2.3.0</version>
  <scope>test</scope>
</dependency>
  • Mapper接口
@Mapper
public interface CityMapper {
    @Select("SELECT * FROM CITY WHERE state = #{state}")
    City findByState(@Param("state") String state);
}
  • 使用junit5的测试类
// 使用junit5
@MybatisTest
// 使用真实的数据源进行测试
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class CityMapperTest {
    @Autowired
    private CityMapper cityMapper;
    @Test
    public void findByStateTest() {
        City city = cityMapper.findByState("CA");
        assertThat(city.getName()).isEqualTo("San Francisco");
        assertThat(city.getState()).isEqualTo("CA");
        assertThat(city.getCountry()).isEqualTo("US");
    }
}
  • 自定义一个启动类

@MybatisTest 在默认情况下将会探测到带有 @SpringBootApplication 的类。 因此,由于 bean 定义的一些方法,可能会发生一些意想不到的错误,或者一些不必要的组件被装入 ApplicationContext 。 为了避免这种情况,我们可以在与测试类相同的包中创建带有 @SpringBootApplication 的类。

package sample.mybatis.mapper;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
class MapperTestApplication {
}

  • 运行结果

但是, 上面是使用原生mybatis的测试方式,而我们项目用的是基于mybatis封装的开源框架tkMappergithub地址是https://github.com/abel533/Mapper,并不适用啊,无解,只能去看下mybatis-spring-boot-starter-test的原理。

实现原理

实际上mybatis-spring-boot-starter-test的实现原理很简单,代码目录结构如下:

  • @MybatisTest注解如下,引入MybatisTestContextBootstrapper测试引导程序。同时引入其他的注解,进行自动装配。

  • @AutoConfigureMybatisMybatisTest注解引入,会去找META-INF下的spring.factories,自动组装mybatis相关的bean

那么基于目前的理解,我们也可以简单实现一个基于TkMapper的测试框架。

Mapper测试框架

  • 我们参照mybatis原生的实现方式

  • 修改spring.factories添加MapperAutoConfiguration

  • 使用自定义测试注解@MapperTest

虽然这里有insert语句,但是测试结束,数据不会真的插入到表中,因为MapperTest注解上包含了事务注解,所以是可以反复进行测试的。

总结

本文分享了基于springboot+mybatis项目中针对数据访问层进行单元测试的一种方式,这种方式只注入mybatis相关的bean,快速高效的对不同类型的数据库进行测试,保证程序的正确性。

其实,对于大多数据的程序员来说,写单元测试可能是一种负担和累赘,但是如果你的单元测试真的能够在你的项目中有其价值,那么就是值得的,千万不要为了单元测试而单元测试。

到此这篇关于基于Springboot+Mybatis对数据访问层进行单元测试的方式分享的文章就介绍到这了,更多相关Springboot+Mybatis对数据访问层进行单元测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java拼接字符串时如何去掉最后一个多余的逗号

    Java拼接字符串时如何去掉最后一个多余的逗号

    当我们遍历拼接字符串的时候,最后会多出一个我们添加的字符(比如逗号),下面通过实例代码给大家介绍Java拼接字符串时去掉最后一个多余的逗号,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Java用 Rhino/Nashorn 代替第三方 JSON 转换库

    Java用 Rhino/Nashorn 代替第三方 JSON 转换库

    本篇文章主要介绍了Java用 Rhino/Nashorn 代替第三方 JSON 转换库,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • JAVA调用Deepseek的api完成基本对话简单代码示例

    JAVA调用Deepseek的api完成基本对话简单代码示例

    这篇文章主要介绍了JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeek API密钥、添加HTTP客户端依赖、创建HTTP请求并使用示例代码来对接DeepSeek API,需要的朋友可以参考下
    2025-02-02
  • JAVA字符串拼接常见方法汇总

    JAVA字符串拼接常见方法汇总

    这篇文章主要介绍了JAVA字符串拼接常见方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable底层原理以及常见面试题

    今天小编就为大家分享一篇关于HashMap和HashTable底层原理以及常见面试题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • mybatis拦截器的使用方式(输出日志或sql语句)

    mybatis拦截器的使用方式(输出日志或sql语句)

    这篇文章主要介绍了mybatis拦截器的使用方式(输出日志或sql语句),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Quartz中的Job与JobDetail解析

    Quartz中的Job与JobDetail解析

    这篇文章主要介绍了Quartz中的Job与JobDetail解析,你定义了一个实现Job接口的类,这个类仅仅表明该job需要完成什么类型的任务,除此之外,Quartz还需要知道该Job实例所包含的属性;这将由JobDetail类来完成,需要的朋友可以参考下
    2023-11-11
  • 关于Http持久连接和HttpClient连接池的深入理解

    关于Http持久连接和HttpClient连接池的深入理解

    众所周知,httpclient是java开发中非常常见的一种访问网络资源的方式了,下面这篇文章主要给大家介绍了关于Http持久连接和HttpClient连接池的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-05-05
  • BufferedReader中read()方法和readLine()方法的使用

    BufferedReader中read()方法和readLine()方法的使用

    这篇文章主要介绍了BufferedReader中read()方法和readLine()方法的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 使用webservice自定义注解处理参数加解密问题

    使用webservice自定义注解处理参数加解密问题

    这篇文章主要介绍了使用webservice自定义注解处理参数加解密问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论