# spring-junit-test **Repository Path**: Zhibo_Lyu/spring-junit-test ## Basic Information - **Project Name**: spring-junit-test - **Description**: # spring-juint-test spring-juint-test 是一个用于Spring项目单元测试对工具包。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-12-07 - **Last Updated**: 2024-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 为什么要有Spring-Junit-Test > 不愿意执行单元测试,因为单元测试运行太慢,代码只有20行,启动要了3分钟。跑个单元测试时间全在等。 ### 现有的单元测试框架 - **Spring-test** `JUnit` - 加在内容多、启动耗时极长`等同于项目容器启动耗时` - 哪怕你只需要运行一个单元测试方法也需要消耗同等的启动时长,初始化大量无用Bean - **Spring Mock** - 不加载外部资源、无法自动连接数据库、MQ等中间件。 ​ **Spring-Junit-Test**,完美解决了以上痛点。相比于Spring-test,可以在极短的时间内成功运行单元测试方法,**自动初始化需要的Bean** ,**减少 90% 的启动时间**;相比于Spring Mock,会根据单元测试需要 **自动加载、连接数据库、MQ等需要的中间件** ,无代码侵入性,测试效果与Spring-test一致。 # Spring-Junit-Test的设计亮点 - Spring-Junit-Test支持Spring的规约,Spring项目切换使用 Spring-Junit-Test来做单元测试 可以做到 **零** 代码修改。 * 使用Spring-Junit-Test和使用SpringBootTest一样简单,你不用像使用Mock一样,需要在测试类中声明方法需要用到的bean使用mock方式注入。如果你已经使用了Mock工具,测试类里面都是用到mock的注解。那也没事,Spring-Junit-Test已经支持Mock工具,对你原来的测试用例依然支持。 * Spring-Junit-Test支持动态测试数据库(Mysql 容器,H2两种方式)的测试,需要开发人员预先准备好相应的sql脚本,给定动态测试数据库的配置,和在测试类中声明走动态测试数据库注解。当执行单元测试时,会预先加载sql,相应的配置构建好相应的测试数据库,然后再执行方法。 # Spring-Junit-Test的原理 ​ Spring-Junit-Test是 **基于Spring框架** 的基础上开发。相较于 SpringBootTest,**优化了Bean初始化流程**,Spring-Junit-Test加载好环境配置和Bean对应的类信息后, 会最先初始化测试类对应的Bean对象 ,并对其成员变量,注入一个代理bean`按需注入`。执行测试方法时,会对用到的未实例化的Bean进行实例化,被实例化的Bean 的成员变量也会被注入注入一个代理bean,只有被用到的成员变量才会被实例化`按需实例化`。**整个流程通过减少对不必要的Bean的注入、实例化来大幅缩减启动时间**`懒加载思路`。【这样就不用和SpringBootTest一样进行全环境的初始化了】 以上面TestDemo为例,在执行runTest方法执行,会实例化,初始化TestDemo这个Bean。给TestDemo注入一个ServiceDemo的代理对象,当执行ServiceDemo的test方法时,才对ServiceDemo代理对象进行实例化,并初始化。如此这样重复性的进行操作。 ​ 如果中间用到Mysql,则会与Mysql建立连接,执行sql,如果用到Redis,就和redis建立连接,如果用到远程服务dubbo或者RestTemplate,就建立远程连接。如果没有用到远程服务,就不会多余的事情。【这一点是mock工具不支持】