# REQ-USR-004 登录用户 — 功能测试证据(verify, round 0) > 关联 spec:`docs/superpowers/specs/2026-06-01-REQ-USR-004.md` > 阶段:后端(backend)。验证目标 = 后端单元 + 集成测试全量绿。 > 生成时间:2026-06-01。 ## 1. 测试命令 | 项 | 值 | |---|---| | command | `mvn -B test`(工作目录 `backend/`,对应 docs/04 § 零「后端 unit」命令 `mvn -q -B test`,verify 去掉 `-q` 以采集逐类汇总) | | exit_code | `0` | | 构建结果 | `BUILD SUCCESS` | | passed | `125` | | failed | `0`(Failures=0, Errors=0) | | skipped | `0` | | failed_list | `[]`(无失败用例) | > 注:Maven reactor 屏幕末尾的 `Tests run: 88` 为日志被 Spring TestContext 初始化噪声截断后的部分聚合行;以 `target/surefire-reports/*.txt` 逐类报告求和为权威口径 = **125 tests / 0 fail / 0 error / 0 skip**,与上游 TDD 摘要「全量 125 测试通过」一致。 ## 2. 运行环境关键发现(影响复现) - 本机 PATH 默认 `java` = **OpenJDK 25.0.2(Homebrew)**,超出项目锁定的 **Java 17 / 21**(docs/04 § 零 技术栈表)。 - 在 JDK 25 下首次执行 `mvn -B test`:`Tests run: 88, Failures: 0, Errors: 9` —— `com.xly.erp.modules.usr.service.UsrAuthServiceImplTest` 的 9 个用例在 `setUp:54` 全部 error,根因为 `Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil`(Mockito inline mock maker 在 JDK 25 下无法插桩该类)。这是**运行环境 JDK 版本越界**导致的工具链不兼容,**非被测业务代码缺陷**。 - 切换到项目锁定版本 **JDK 21**(`/opt/homebrew/Cellar/openjdk@21/21.0.11/.../Home`,`/usr/libexec/java_home -V` 确认已安装)后,`mvn -B test` **全量 125 用例通过,exit_code=0,BUILD SUCCESS**。 - 权威结论以**项目锁定 JDK(17/21)**下的运行为准:测试闸通过。建议执行环境将默认 `java` / `JAVA_HOME` 固定到 JDK 17 或 21,避免 JDK 25 下 Mockito 误报。 ## 3. 逐测试类结果(surefire-reports 求和,JDK 21) | 测试类 | run | fail | error | skip | |---|---|---|---|---| | common.config.SecurityConfigTest | 2 | 0 | 0 | 0 | | common.exception.GlobalExceptionHandlerTest | 1 | 0 | 0 | 0 | | common.response.PageResultTest | 2 | 0 | 0 | 0 | | common.response.ResultCodeLoginTest | 2 | 0 | 0 | 0 | | common.response.ResultTest | 2 | 0 | 0 | 0 | | common.security.JwtUtilTest | 1 | 0 | 0 | 0 | | ErpApplicationTests | 1 | 0 | 0 | 0 | | modules.usr.AuthLoginConfigIT | 1 | 0 | 0 | 0 | | modules.usr.controller.UsrAuthControllerTest | 6 | 0 | 0 | 0 | | modules.usr.controller.UsrUserControllerTest | 11 | 0 | 0 | 0 | | modules.usr.dto.CreateUserDTOValidationTest | 3 | 0 | 0 | 0 | | modules.usr.dto.LoginDTOValidationTest | 6 | 0 | 0 | 0 | | modules.usr.dto.UpdateUserDTOValidationTest | 5 | 0 | 0 | 0 | | modules.usr.dto.UserQueryDTOValidationTest | 5 | 0 | 0 | 0 | | modules.usr.mapper.UsrCompanyMapperTest | 2 | 0 | 0 | 0 | | modules.usr.mapper.UsrUserMapperPageTest | 3 | 0 | 0 | 0 | | modules.usr.service.UsrAuthServiceImplTest | 9 | 0 | 0 | 0 | | modules.usr.service.UsrUserServiceImplTest | 24 | 0 | 0 | 0 | | modules.usr.UsrLoginIT | 12 | 0 | 0 | 0 | | modules.usr.UsrUserCreateIT | 5 | 0 | 0 | 0 | | modules.usr.UsrUserQueryIT | 13 | 0 | 0 | 0 | | modules.usr.UsrUserUpdateIT | 6 | 0 | 0 | 0 | | modules.usr.vo.CompanyOptionVOJsonTest | 1 | 0 | 0 | 0 | | modules.usr.vo.LoginVOJsonTest | 1 | 0 | 0 | 0 | | modules.usr.vo.UserVOJsonTest | 1 | 0 | 0 | 0 | | **合计(25 类)** | **125** | **0** | **0** | **0** | ## 4. REQ-USR-004 验收覆盖映射(spec § 7 ↔ 测试) REQ-USR-004 专属覆盖落在以下测试类(其余为既有 USR-001/002/003 回归,全绿): - `UsrLoginIT`(12 例,ac1–ac12 端到端):正确凭据登录成功 + 返回 token/user 且不含 sPassword(ac1/11)、token 可被受保护接口接受(ac2/12)、登录更新 tLastLoginDate(ac3)、密码错误统一 40101(ac4)、账号不存在与密码错误响应完全一致(ac5)、禁用用户 40302(ac6)、参数缺失 40001(ac7)、companyId 非法 40001(ac8)、连续失败限流 42901 + 成功清零(ac9)、GET /api/usr/companies 放行全量返回(ac10)、JWT 含 exp(ac12)。 - `UsrAuthServiceImplTest`(9 例):认证主流程顺序判定、防枚举、限流计数、BCrypt 比对、@Transactional 更新登录时间等 Service 单元。 - `UsrAuthControllerTest`(6 例):`POST /api/usr/login` + `GET /api/usr/companies` 校验与委派。 - `LoginDTOValidationTest`(6)/`LoginVOJsonTest`(1)/`CompanyOptionVOJsonTest`(1)/`UsrCompanyMapperTest`(2)/`ResultCodeLoginTest`(2,含 42901)/`SecurityConfigTest`(2,含放行 /api/usr/companies)/`AuthLoginConfigIT`(1,限流配置项 5/300)。 ## 5. 结论 - 测试闸:**绿**(exit_code=0,125/125 通过,0 失败 0 错误 0 跳过,BUILD SUCCESS)—— 以项目锁定 JDK 21 运行为权威口径。 - 工作树:commit 前为 clean(仅本证据文件为新增)。 - 唯一风险提示:执行宿主默认 `java` 为越界的 JDK 25,会触发 Mockito 对 `JwtUtil` 的插桩失败(9 error);非代码缺陷,需将默认 JDK 固定为 17/21。