Commit 26523d4f72fa49217cae0d81cbe21ccaffe8fbe4

Authored by zichun
1 parent f500f612

docs(verify:REQ-USR-004): 证据验证

docs/superpowers/reviews/2026-06-01-REQ-USR-004-verify.md 0 → 100644
  1 +# REQ-USR-004 登录用户 — 功能测试证据(verify, round 0)
  2 +
  3 +> 关联 spec:`docs/superpowers/specs/2026-06-01-REQ-USR-004.md`
  4 +> 阶段:后端(backend)。验证目标 = 后端单元 + 集成测试全量绿。
  5 +> 生成时间:2026-06-01。
  6 +
  7 +## 1. 测试命令
  8 +
  9 +| 项 | 值 |
  10 +|---|---|
  11 +| command | `mvn -B test`(工作目录 `backend/`,对应 docs/04 § 零「后端 unit」命令 `mvn -q -B test`,verify 去掉 `-q` 以采集逐类汇总) |
  12 +| exit_code | `0` |
  13 +| 构建结果 | `BUILD SUCCESS` |
  14 +| passed | `125` |
  15 +| failed | `0`(Failures=0, Errors=0) |
  16 +| skipped | `0` |
  17 +| failed_list | `[]`(无失败用例) |
  18 +
  19 +> 注:Maven reactor 屏幕末尾的 `Tests run: 88` 为日志被 Spring TestContext 初始化噪声截断后的部分聚合行;以 `target/surefire-reports/*.txt` 逐类报告求和为权威口径 = **125 tests / 0 fail / 0 error / 0 skip**,与上游 TDD 摘要「全量 125 测试通过」一致。
  20 +
  21 +## 2. 运行环境关键发现(影响复现)
  22 +
  23 +- 本机 PATH 默认 `java` = **OpenJDK 25.0.2(Homebrew)**,超出项目锁定的 **Java 17 / 21**(docs/04 § 零 技术栈表)。
  24 +- 在 JDK 25 下首次执行 `mvn -B test`:`Tests run: 88, Failures: 0, Errors: 9` —— `com.xly.erp.modules.usr.service.UsrAuthServiceImplTest` 的 9 个用例在 `setUp:54` 全部 error,根因为
  25 + `Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil`(Mockito inline mock maker 在 JDK 25 下无法插桩该类)。这是**运行环境 JDK 版本越界**导致的工具链不兼容,**非被测业务代码缺陷**。
  26 +- 切换到项目锁定版本 **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**。
  27 +- 权威结论以**项目锁定 JDK(17/21)**下的运行为准:测试闸通过。建议执行环境将默认 `java` / `JAVA_HOME` 固定到 JDK 17 或 21,避免 JDK 25 下 Mockito 误报。
  28 +
  29 +## 3. 逐测试类结果(surefire-reports 求和,JDK 21)
  30 +
  31 +| 测试类 | run | fail | error | skip |
  32 +|---|---|---|---|---|
  33 +| common.config.SecurityConfigTest | 2 | 0 | 0 | 0 |
  34 +| common.exception.GlobalExceptionHandlerTest | 1 | 0 | 0 | 0 |
  35 +| common.response.PageResultTest | 2 | 0 | 0 | 0 |
  36 +| common.response.ResultCodeLoginTest | 2 | 0 | 0 | 0 |
  37 +| common.response.ResultTest | 2 | 0 | 0 | 0 |
  38 +| common.security.JwtUtilTest | 1 | 0 | 0 | 0 |
  39 +| ErpApplicationTests | 1 | 0 | 0 | 0 |
  40 +| modules.usr.AuthLoginConfigIT | 1 | 0 | 0 | 0 |
  41 +| modules.usr.controller.UsrAuthControllerTest | 6 | 0 | 0 | 0 |
  42 +| modules.usr.controller.UsrUserControllerTest | 11 | 0 | 0 | 0 |
  43 +| modules.usr.dto.CreateUserDTOValidationTest | 3 | 0 | 0 | 0 |
  44 +| modules.usr.dto.LoginDTOValidationTest | 6 | 0 | 0 | 0 |
  45 +| modules.usr.dto.UpdateUserDTOValidationTest | 5 | 0 | 0 | 0 |
  46 +| modules.usr.dto.UserQueryDTOValidationTest | 5 | 0 | 0 | 0 |
  47 +| modules.usr.mapper.UsrCompanyMapperTest | 2 | 0 | 0 | 0 |
  48 +| modules.usr.mapper.UsrUserMapperPageTest | 3 | 0 | 0 | 0 |
  49 +| modules.usr.service.UsrAuthServiceImplTest | 9 | 0 | 0 | 0 |
  50 +| modules.usr.service.UsrUserServiceImplTest | 24 | 0 | 0 | 0 |
  51 +| modules.usr.UsrLoginIT | 12 | 0 | 0 | 0 |
  52 +| modules.usr.UsrUserCreateIT | 5 | 0 | 0 | 0 |
  53 +| modules.usr.UsrUserQueryIT | 13 | 0 | 0 | 0 |
  54 +| modules.usr.UsrUserUpdateIT | 6 | 0 | 0 | 0 |
  55 +| modules.usr.vo.CompanyOptionVOJsonTest | 1 | 0 | 0 | 0 |
  56 +| modules.usr.vo.LoginVOJsonTest | 1 | 0 | 0 | 0 |
  57 +| modules.usr.vo.UserVOJsonTest | 1 | 0 | 0 | 0 |
  58 +| **合计(25 类)** | **125** | **0** | **0** | **0** |
  59 +
  60 +## 4. REQ-USR-004 验收覆盖映射(spec § 7 ↔ 测试)
  61 +
  62 +REQ-USR-004 专属覆盖落在以下测试类(其余为既有 USR-001/002/003 回归,全绿):
  63 +
  64 +- `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)。
  65 +- `UsrAuthServiceImplTest`(9 例):认证主流程顺序判定、防枚举、限流计数、BCrypt 比对、@Transactional 更新登录时间等 Service 单元。
  66 +- `UsrAuthControllerTest`(6 例):`POST /api/usr/login` + `GET /api/usr/companies` 校验与委派。
  67 +- `LoginDTOValidationTest`(6)/`LoginVOJsonTest`(1)/`CompanyOptionVOJsonTest`(1)/`UsrCompanyMapperTest`(2)/`ResultCodeLoginTest`(2,含 42901)/`SecurityConfigTest`(2,含放行 /api/usr/companies)/`AuthLoginConfigIT`(1,限流配置项 5/300)。
  68 +
  69 +## 5. 结论
  70 +
  71 +- 测试闸:**绿**(exit_code=0,125/125 通过,0 失败 0 错误 0 跳过,BUILD SUCCESS)—— 以项目锁定 JDK 21 运行为权威口径。
  72 +- 工作树:commit 前为 clean(仅本证据文件为新增)。
  73 +- 唯一风险提示:执行宿主默认 `java` 为越界的 JDK 25,会触发 Mockito 对 `JwtUtil` 的插桩失败(9 error);非代码缺陷,需将默认 JDK 固定为 17/21。
... ...