
Sa-Token 测试基础设施与集成测试全解从共享模型、契约测试到多框架 / 多协议的真实 HTTP 集成验证【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token本文以 Sa-Token 仓库中 sa-token-testing/README.md 为主体结合 sa-token-testing 目录下真实源码系统讲解 Sa-Token 的测试基础设施与集成测试体系包括共享测试模型SysUser / SysRole、JSON / Redis Dao / HTTP 契约测试公共库、Spring Boot 2/3/4 与 WebFluxReactor集成测试、Bean 注入专项隔离测试、Solon / LoveQQ / JFinal / JBoot 多框架真实 HTTP 集成以及 SSO / OAuth2 / Dubbo / Dubbo3 / gRPC 协议级端到端验证和 JaCoCo 覆盖率聚合。读完本文你将掌握 Sa-Token 全仓库测试模块的职责划分、隔离设计思路与逐模块运行方式可直接用于本地复现与二次开发验证。一、sa-token-testing 模块定位测试怎么分层sa-token-testing是 Sa-Token 的测试基础设施与集成测试聚合模块在根目录 pom.xml 中被整体纳入构建。它本身不发布任何生产制品pom.xml 中maven.deploy.skip与central.publishing.skip均为true只负责验证生产模块的行为。其核心设计理念可概括为一条主线公共接线在integration-boot2验一次integration-boot3/4只补版本差异不重复全量。也就是说Sa-Token 的测试不是每个 Starter 各自造一套轮子而是遵循一次主验证 差异化补测的策略大幅降低维护成本。从 sa-token-testing/pom.xml 的modules声明看整个聚合模块共包含 23 个子模块可以划分为四个层次层次代表模块职责共享测试模型Fixturesa-token-test-support无Test的纯测试资源供各插件单测复用契约测试公共库Contract Commonsa-token-json-test-common、sa-token-redis-dao-test-common、sa-token-http-test-common把同一套行为断言抽象出来各插件实现各自跑一遍集成测试Integrationboot2/3/4、reactor-boot2/3/4、solon、loveqq、jfinal、jboot、sso、oauth2、dubbo、dubbo3、grpc真容器 / 真 HTTP / 真 RPC 的端到端验证覆盖率聚合sa-token-coverage非功能测试汇总全仓库 JaCoCo 报告此外还有两个特殊模块sa-token-integration-beaninject-boot2与sa-token-integration-beaninject-solon它们以独立模块 / 独立 JVM的方式运行专门验证 Spring / Solon Bean 注入链路避免污染全局静态状态详见第五节。二、共享测试模型与契约测试公共库1. sa-token-test-support无Test的共享测试模型该模块不包含任何测试方法无Test只提供共享测试模型SysUser/SysRole供各插件单测复用如 sa-token-serializer-features。源码位于 sa-token-test-support例如SysUser.java用户实体实现了Serializable与SaJsonType接口SaJsonType是 Sa-Token JSON 序列化层的类型标记接口来自 sa-token-core字段包含id/name/age/role提供无参构造与带参构造方便各 JSON 插件进行序列化往返测试SysRole.java角色实体同样实现Serializable与SaJsonType。其价值在于JSON 插件、序列化插件等单元测试无需各自定义实体类直接用统一的模型即可保证同一份数据、同一套断言避免各插件测试数据漂移。2. sa-token-json-test-commonJSON 插件的统一契约该模块也是测试支持无Test供 7 个 JSON 插件单测复用sa-token-jacksonsa-token-jackson3sa-token-fastjsonsa-token-fastjson2sa-token-fory-jsonsa-token-snack3sa-token-snack4核心实现是 SaJsonTemplateTestCommon.java它定义了一整套可继承的断言方法每个插件只需继承该基类并注入自身实现即可assertTemplate(...)验证模板注册SaManager.setSaJsonTemplate(template)后能取回正确类型、对象往返、空值与 Map 转换的基础契约assertUserRoundTrip(...)验证SysUser对象按指定的类型信息策略完成序列化和反序列化并可选择校验无类型信息转换untyped conversionassertNullConversions(...)/assertEmptyStringConversions(...)验证四个 JSON 转换入口objectToJson/jsonToObject/jsonToMap对null与空字符串的统一处理assertMapRoundTrip(...)验证 Map 往返需要时同时校验实现定义的字段顺序例如对字段顺序敏感的 JSON 库assertCommonSessionTypes(...)验证 Session 中常见 JDK 类型Date/BigDecimal/LocalDateTime的往返strictTypes严格模式要求保持原始类型非严格模式则兼容数值化表示的实现assertWrapperTypesInSessionMap(...)验证 Session Map 中的Long等包装类型可按原类型读回assertBlocksUnknownAllowType(...)验证未进入白名单的危险类型会被拒绝例如反序列化java.lang.ProcessBuilder应抛出SaJsonConvertException错误信息提示请先将其注册到 JSON 全局类型白名单assertClassNotFoundMessage(...)验证不存在的类型保留库原始异常信息而非误报白名单assertStrategyCannotBeChangedAfterInitialization(...)验证 JSON 策略初始化后禁止继续变更类型白名单SaJsonStrategy.instance.registerAllowType(...)应抛出SaTokenExceptionassertPluginInstall(...)验证安装插件后替换 JSON 模板和 Session 创建策略。每个AfterEach都会把全局 JSON 策略重置回默认实现SaManager.setSaJsonTemplate(new SaJsonTemplateDefaultImpl())保证多个插件测试之间互不污染。3. sa-token-redis-dao-test-commonRedis Dao 的统一契约供 Redis Dao 插件单测复用sa-token-redissonsa-token-redisx源码位于 sa-token-redis-dao-test-common包含JedisMockRedisSupport.javaJedis 模拟支持从命名看以内存 mock 方式模拟 Redis 行为避免单测依赖真实 Redis 服务SaTokenDaoStringTestCommon.javaSaTokenDao字符串类操作token / session 键值读写的统一契约断言SaTokenDaoLoginAsserts.java登录相关断言验证 Dao 层在登录流程中的读写行为。4. sa-token-http-test-commonHTTP 客户端插件的统一契约供 HTTP 客户端插件单测复用sa-token-forestsa-token-okhttpssa-token-rest-clientsa-token-rest-template源码位于 sa-token-http-test-common其中LocalHttpServer.java本地 HTTP 测试服务端供各 HTTP 客户端插件向其发起真实请求SaHttpTemplateTestCommon.javaHTTP 请求模板的统一契约断言。三、Spring Boot / WebFlux 集成测试主验证 版本差异补测1. sa-token-integration-boot2Boot 2 主集成全量覆盖这是 WebMVC 体系的主集成模块覆盖Starter 接线与业务场景完整覆盖以下生产模块sa-token-spring-boot-startersa-token-spring-boot-webmvc-reactor-v2v3v4-commonsa-token-servletsa-token-jacksonStarter 传递依赖从 pom.xml 可见其直接依赖sa-token-spring-boot-starter并通过该 Starter 传递引入 sa-token-jackson。测试源码位于 sa-token-integration-boot2覆盖场景包括登录认证LoginIntegrationTest.java基于MockMvc的登录流程验证配套 support 目录 中的AbstractMockMvcIntegrationTest、MockMvcSaResultClient、IntegrationTestExtension等基础设施注解鉴权AnnotationAuthIntegrationTest.java配套 SaAnnotationController.java 与 SaAnnotationIgnoreController.java注解忽略场景路由拦截RouterIntegrationTest.java配套 RouterController.java自动配置AutoConfigurationIntegrationTest.java版本差异点PathPatternIntegrationTest.java路径匹配器行为Spring Boot 2.x 默认PathPattern与AntPathMatcher的差异插件组合MoreIntegrationTest.java。测试使用StpInterfaceImpl实现权限接口、GlobalExceptionHandler统一异常处理、AnnotationAuthConfig/RouterAuthConfig鉴权配置作为测试夹具入口为IntegrationBoot2Application。2. sa-token-integration-boot3仅补 Boot 3 差异Boot 3 集成测试只补与 Boot 2 的行为差异不重复全量覆盖sa-token-spring-boot3-startersa-token-spring-boot-webmvc-v3v4-commonsa-token-jakarta-servletBoot 3 的关键差异在于javax.servlet→jakarta.servlet的包迁移因此测试源码中专门有 JakartaContextIntegrationTest.java 验证 Jakarta 上下文适配以及 ServletFilterIntegrationTest.java 验证 Servlet Filter 行为入口为IntegrationBoot3Application。3. sa-token-integration-boot4仅补 Boot 4 差异Boot 4 集成测试只测 Boot 4 差异覆盖sa-token-spring-boot4-startersa-token-jackson3其中webmvc-v3v4-common/jakarta-servlet的验证见 boot3即两代共用同一套 common 代码Boot 3 已全量验证过Boot 4 只需确认 Starter 装配与 Jackson 3 的适配。测试源码中 Boot4MockMvcSupport.java 是 Boot 4 特有的 MockMvc 支撑类入口为IntegrationBoot4Application。版本一致性约束sa-token-testing父 pom.xml 中显式声明springboot2.version2.7.18、springboot3.version3.5.11、springboot4.version4.0.3并注明必须与 sa-token-spring-boot2/3/4-dependencies 的 springbootX.version 保持一致这是多版本并行测试的前提。4. ReactorWebFlux系列基于 WebTestClientWebFlux 体系同样采用主集成 差异补测sa-token-integration-reactor-boot2Boot 2 主集成基于 WebTestClient覆盖 sa-token-reactor-spring-boot-starter。测试场景包括 LoginIntegrationTest.javaWebFlux 登录、RouterIntegrationTest.java路由拦截、AutoConfigurationIntegrationTest.java以及 GuardController.javaWebFlux 防护路由sa-token-integration-reactor-boot3仅 Boot 3 版本差异覆盖sa-token-reactor-spring-boot3-starterREADME 注明其真身是 sa-token-spring-boot-reactor-v3v4-common差异点包括 ReactorContextIntegrationTest.javaReactor 上下文与 ReactorFilterIntegrationTest.javasa-token-integration-reactor-boot4仅 Boot 4 版本差异覆盖sa-token-reactor-spring-boot4-starter真身同为 reactor-v3v4-common。四、多框架集成测试Solon / LoveQQ / JFinal / JBoot 的真实请求链路Sa-Token 不止支持 Spring 生态sa-token-testing还覆盖了 Solon、LoveQQ、JFinal、JBoot 四类框架且都是真实 HTTP 请求链路不是 mock。1. sa-token-integration-solonFilter / Interceptor 真实请求覆盖 sa-token-solon-plugin包含两套独立的测试应用filterapp基于 Filter 的鉴权链路FilterAppFilterAuthConfigFilterControllerFilterHttpTest并带一个PingGateway网关探活入口interceptorapp基于 Interceptor 的鉴权链路InterceptorAppInterceptorAuthConfigInterceptorControllerInterceptorHttpTest。2. sa-token-integration-loveqqFilter / Interceptor / Bean 注入 / 条件装配覆盖 sa-token-loveqq-boot-starter测试场景更丰富filterappFilter 鉴权interceptorappInterceptor 鉴权injectappBean 注入InjectLoveqqTestredissondaoRedisson Dao 条件装配RedissonDaoInjectTest验证按条件装配 Redis Dao 的行为。3. sa-token-integration-jfinal真实 Undertow 注解鉴权不起 Redis覆盖 sa-token-jfinal-plugin使用真实 Undertow 容器JfinalHttpTest.java真实 HTTP 测试覆盖SaTokenActionHandler上下文与SaAnnotationInterceptor注解鉴权配套 JfinalHttpController.java、JfinalHttpTestConfig.java、JfinalStpInterface.java按 README 说明不起 Redis聚焦框架适配本身。4. sa-token-integration-jboot真实 Undertow 注解鉴权不起 Redis / RPC覆盖 sa-token-jboot-plugin同样使用真实 UndertowJbootHttpTest.java验证SaTokenContextForJboot上下文与SaAnnotationInterceptor注解鉴权配套 JbootHttpController.java、JbootHttpTestListener.java、JbootStpInterface.java按 README 说明不起 Redis / RPC。五、Bean 注入专项测试独立模块 / 独立 JVM 隔离全局状态SaManager、SaStrategy等是 Sa-Token 的全局静态状态一旦被某个测试污染会影响后续所有测试。因此 Bean 注入测试被设计为独立模块 / 独立 JVM运行1. sa-token-integration-beaninject-boot2覆盖SaBeanInject OAuth2 / SSO / Sign / ApiKey 全部*BeanInject注入点仅验证 Spring Bean → Manager/Strategy 的注入链路不测插件业务。源码位于 sa-token-integration-beaninject-boot2其中 override 目录下定义了超过 20 个自定义实现类逐一覆盖 Sa-Token 的注入面CustomSaTokenDao、CustomSaTokenContext、CustomSaTokenListener、CustomSaLog、CustomSaJsonTemplate、CustomSaSerializerTemplate、CustomSaTokenPluginHolder、CustomSaCheckLoginHandler、CustomStpLogic、CustomStpInterface、CustomSaFirewallCheckHook、CustomSaCorsHandleFunction、CustomSaHttpBasicTemplate、CustomSaHttpDigestTemplate、CustomSaHttpTemplate、CustomSaSameTemplate、CustomSaTempTemplate、CustomSaTotpTemplate以及 OAuth2 全家桶CustomSaOAuth2Dao、CustomSaOAuth2DataLoader、CustomSaOAuth2DataResolver、CustomSaOAuth2DataConverter、CustomSaOAuth2DataGenerate、CustomSaOAuth2GrantTypeHandler、CustomSaOAuth2ScopeHandler、CustomSaOAuth2ServerProcessor、CustomSaOAuth2Template、SSOCustomSaSsoClientTemplate、CustomSaSsoServerTemplate、SignCustomSaSignTemplate、ApiKeyCustomSaApiKeyDataLoader、CustomSaApiKeyTemplate。核心测试 SaBeanInjectIntegrationTest.java 通过Autowired注入上述自定义 Bean逐一断言SaBeanInject注入方法是否生效例如自定义StpInterface是否真正替换了权限查询策略、自定义SaTokenDao是否接管了数据读写等。另有 PluginBeanInjectIntegrationTest.java 验证插件 Bean 注入、SaSsoBeanRegisterCoverageTest.java 验证 SSO Bean 注册覆盖率。2. sa-token-integration-beaninject-solon同样的思路在 Solon 体系中复刻覆盖SaBeanInject OAuth2 / SSO / Sign / ApiKey 全部*BeanInject注入点仅验证 Solon Bean → Manager/Strategy 的注入链路。源码位于 sa-token-integration-beaninject-solon核心测试为 InjectSolonTest.java。六、协议级集成测试SSO / OAuth2 的真实 HTTP 302 与 token 验证1. sa-token-integration-sso同一进程挂 Server Client 双角色覆盖 sa-token-sso其测试设计非常真实同一进程同时挂 Server Client 两套路由和两套StpLogic不拆两个进程真 302 / Location 验证而不是 mock 重定向覆盖模式一 / 二 / 三跳转和单点注销SSO 的三种典型登录模式按 README 说明不起 Redis。关键实现SsoDualRoleConfig.java实现ApplicationRunner在内嵌端口启动后接线——为 Server 和 Client 各创建一套StpLogic登录类型分别为sso-server/sso-clienttoken 名分别为satoken-server/satoken-client把端口写进allowUrl/serverUrl并注入真实 HTTP 发送策略SsoHttp::plainGet、未登录视图、doLoginHandle登录处理函数sa/123456为测试账号密码SsoHttpIntegrationTest.java完整的协议行为断言包括——未登录访问 Client/sso/login应 302 去 Server/sso/auth且携带redirect与client参数Server 未登录访问/sso/auth应返回登录视图200而不是 302模式三全流程Client 登录 → Server 登录 → 带 ticket 回来 → Client 登录成功模式一已登录后modesimple应 302 回 redirect 且不带 ticket模式二ticket 写进共享 Dao 后可checkTicket校验并删除安全校验非法 redirect如http://evil.com/steal不应 302 到恶意域名带的 redirect 应被拒绝对应SaSsoErrorCode.CODE_30002/CODE_30001单点注销SLOClient/sso/logout之后两端都应下线backself时返回含document.referrer的 script双 StpLogic 隔离Server 与 Client 的StpLogic必须是不同的实例、不同的登录类型。2. sa-token-integration-oauth2OAuth2 协议的完整授权流覆盖 sa-token-oauth2同样是 Spring Boot 2 真 HTTP真 302 / Location 和 token JSON验证覆盖授权码authorization code、隐藏式implicit、密码password、凭证client credentials、刷新refresh token、回收revoke、确认授权confirm等 OAuth2 核心流程按 README 说明不起 Redis。源码位于 sa-token-integration-oauth2核心测试为 OAuth2HttpIntegrationTest.java配套 OAuth2ServerSetup.javaOAuth2 服务端初始化与 OAuth2ServerController.java。七、RPC 集成测试Dubbo / Dubbo3 / gRPC 的会话下传与回传分布式场景下Sa-Token 通过 RPC Filter / 拦截器实现登录会话在 Consumer 与 Provider 之间的下传与回传并支持Same-Token防重复提交校验。sa-token-testing对三类 RPC 框架做了同构的真 RPC 集成测试。1. sa-token-integration-dubboDubbo 2.xSpring Boot 2同一进程挂 Consumer HTTP Provider本机dubbo://协议使用scoperemote避免 injvm 模式串 ThreadLocal验证会话下传 / 回传、Same-Token按 README 说明不起 Nacos / Redis。核心测试 DubboHttpIntegrationTest.java类注释明确标注Dubbo 2.x 真 RPC本机 dubbo://会话下传 / 回传Same-Token 开着配套 ConsumerController.java、DemoService.java、DemoServiceImpl.java、LoginSnapshot.java登录快照模型。2. sa-token-integration-dubbo3Dubbo3覆盖 sa-token-dubbo3测试结构、运行方式与 Dubbo 2.x 完全对齐同一进程 Consumer Provider、本机dubbo://、scoperemote、会话下传 / 回传、Same-Token、不起 Nacos / Redis核心测试为 Dubbo3HttpIntegrationTest.java。3. sa-token-integration-grpcgRPC 拦截器覆盖 sa-token-grpc使用 gRPC拦截器实现会话透传Spring Boot 2同一进程 Consumer HTTP Provider本机 gRPC 端口验证 Same-Token会话下传 / 回传、未登录匿名对齐 dubbo 那 4 条即与 Dubbo 测试保持同一组断言基线按 README 说明不起 Nacos / Redis。核心测试 GrpcHttpIntegrationTest.java类注释标注gRPC 真 RPC本机端口Same-Token 开着。会话下传 / 回传对齐 Dubbo测试中通过动态注册grpc.client.demo.address指向static://127.0.0.1:端口配套 DemoGrpc.javaproto 生成的接口、DemoGrpcService.javaProvider 实现。八、sa-token-coverage全仓库 JaCoCo 覆盖率聚合sa-token-coverage是覆盖率聚合模块非功能测试汇总全仓库生产模块的 JaCoCo 报告。从 pom.xml 可见其设计将全部生产模块sa-token-core、各 Starter、各插件全量列入依赖注释明确说明生产模块全量列入未测到的显示 0%因此覆盖率报告是诚实的某个模块没有被任何测试触达就会以 0% 显式呈现而不是被悄悄遗漏源码目录 sa-token-coverage/src/coverage-summary 承载覆盖率汇总逻辑。九、如何运行这些测试1. 按模块单独运行推荐README 提供了逐模块运行的 Maven 命令-pl指定模块路径-amalso make自动先构建依赖的上游模块mvn test -pl sa-token-testing/sa-token-integration-boot2 -am mvn test -pl sa-token-testing/sa-token-integration-beaninject-boot2 -am mvn test -pl sa-token-testing/sa-token-integration-boot3 -am mvn test -pl sa-token-testing/sa-token-integration-boot4 -am mvn test -pl sa-token-testing/sa-token-integration-reactor-boot2 -am mvn test -pl sa-token-testing/sa-token-integration-reactor-boot3 -am mvn test -pl sa-token-testing/sa-token-integration-reactor-boot4 -am mvn test -pl sa-token-testing/sa-token-integration-solon -am mvn test -pl sa-token-testing/sa-token-integration-beaninject-solon -am mvn test -pl sa-token-testing/sa-token-integration-loveqq -am mvn test -pl sa-token-testing/sa-token-integration-jfinal -am mvn test -pl sa-token-testing/sa-token-integration-jboot -am mvn test -pl sa-token-testing/sa-token-integration-sso -am mvn test -pl sa-token-testing/sa-token-integration-oauth2 -am mvn test -pl sa-token-testing/sa-token-integration-dubbo -am mvn test -pl sa-token-testing/sa-token-integration-dubbo3 -am mvn test -pl sa-token-testing/sa-token-integration-grpc -am建议按依赖顺序逐模块验证先跑sa-token-test-support、各*-test-common公共库再跑 boot2 主集成最后跑各差异补测模块。2. 全量运行仓库根目录提供了全量测试批处理脚本mvn test.batWindows 环境Linux / macOS 下可手动执行根目录的mvn test触发全仓库测试sa-token-testing所有集成模块都会被纳入。十、设计亮点小结结合 README 与源码可以总结出 Sa-Token 测试体系几个值得借鉴的设计决策主验证 差异补测Boot 2 全量验证公共接线v2v3v4-commonBoot 3/4 只补版本差异避免多版本重复维护契约测试公共库把 JSON / Redis Dao / HTTP 的统一行为断言抽象为无Test的公共基类各插件只需继承 注入自身实现保证行为一致独立 JVM 隔离Bean 注入测试涉及SaManager/SaStrategy等全局静态状态因此拆成独立模块、独立 JVM 运行防止跨测试污染真实协议验证SSO 测真 302 / Location 和 ticket 流转OAuth2 测真 token JSON 与各类授权流Dubbo / gRPC 测真 RPC 会话透传——都是真请求、真协议不是 mock零外部依赖SSO / OAuth2 / Dubbo / gRPC / JFinal / JBoot 等测试均不起 Redis / Nacos通过本机端口、进程内双角色等方式自洽运行让集成测试可离线复现诚实的覆盖率coverage 模块全量列入生产依赖未测到即显示 0%避免覆盖率虚高。如果需要在 Sa-Token 上做二次开发或插件扩展建议优先阅读 sa-token-test-support 与各*-test-common模块了解统一测试基座再参考对应框架的sa-token-integration-*模块复现真实链路这是最贴近官方验证方式的上手路径。【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考