模块 usr — 硬测试闸证据(attempt: 2)
- 模块: usr
- 阶段: backend
- attempt: 2(上一次 attempt 1 = RED,本轮用于辨识 flaky)
- 分支: module-usr
-
命令:
node /Users/reporkey/Desktop/mvp/test6/scripts/test.mjs - 执行时间窗口: 2026-06-01 15:28:50 ~ 15:29:07 CST(约 17 秒,build 增量;测试阶段在 4/5 非零退出即终止)
-
运行 JDK: OpenJDK 25.0.2(Homebrew)——
java -version=openjdk version "25.0.2" 2026-01-20 - 结论: 🔴 RED(exit_code = 1,errors = 9)
① 闸门阶段执行情况
scripts/test.mjs 顺序:setup-db → build → lint → unit+integration → e2e。
| 阶段 | 命令 | 结果 |
|---|---|---|
| 1/5 setup test db | node scripts/setup-test-db.mjs |
✅ 通过(DROP+CREATE 测试库) |
| 2/5 build | mvn -q -B -DskipTests package |
✅ 通过 |
| 3/5 lint | mvn -q -B checkstyle:check |
✅ 通过 |
| 4/5 unit + integration | mvn -q -B test |
🔴 失败(9 errors) |
| 5/5 e2e | echo 占位 | 未执行(脚本在 4/5 非零退出即终止) |
Flyway 在 Spring Boot 测试启动时自动 apply(同 attempt 1)。
② Maven Surefire 汇总(聚合 25 个测试类)
- Tests run = 125
- Passed = 116
- Failures = 0
- Errors = 9
- Skipped = 0
全部 9 个 error 集中在单个测试类:com.xly.erp.modules.usr.service.UsrAuthServiceImplTest(该类 9/9 全部 error)。其余 24 个测试类(含 usr 模块 controller / mapper / dto / vo / IT 集成测试 + common 公共组件)全绿。
失败用例清单(9 条,均为 ERROR)
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.userNotFoundThrows40101
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.wrongPasswordThrows40101
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.disabledUserThrows40302AfterPasswordOk
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.illegalCompanyIdThrows40001
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.listCompaniesMapsAllRows
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.notFoundAndWrongPasswordSameCodeAndMessage
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.rateLimitAfterMaxFailThrows42901
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.successResetsFailCounter
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.successReturnsTokenAndUpdatesLoginTime
③ 根因(toolchain 不兼容,非业务逻辑缺陷)—— 与 attempt 1 完全同源
所有 9 个 error 同源,均在 @BeforeEach setUp(UsrAuthServiceImplTest.java:54)用 Mockito mock JwtUtil 时抛出:
org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil.
...
Byte Buddy could not instrument all classes within the mock's type hierarchy
Caused by: java.lang.IllegalArgumentException: Java 25 (69) is not supported by the
current version of Byte Buddy which officially supports Java 22 (66) -
update Byte Buddy or set net.bytebuddy.experimental as a VM property
at UsrAuthServiceImplTest.setUp(UsrAuthServiceImplTest.java:54)
环境取证:
- 运行 JDK:
openjdk version "25.0.2",vendorHomebrew,JVMOpenJDK 64-Bit Server VM 25.0.2。 - Mockito 随 Spring Boot 3.2.5 BOM 引入的 Byte Buddy 仅官方支持到 Java 22(class file major 66),无法 instrument Java 25(major 69)字节码,inline mock maker 失败。
即:这是构建工具链(JDK 版本与 Mockito/Byte Buddy 兼容性)问题,而非 usr 模块业务代码或测试断言本身的缺陷。集成测试(真实 Spring 上下文 + 真库,不依赖 Mockito mock)全部通过(UsrLoginIT 12、UsrUserQueryIT 13、UsrUserCreateIT 5、UsrUserUpdateIT 6、AuthLoginConfigIT 1 等),恰好佐证业务逻辑路径是通的。
建议修复方向(供上层 retry / 仲裁,本步骤不改源码)
任选其一:
- 降低构建 JDK 至 LTS 21(最稳;与 Spring Boot 3.2.5 + 项目 Mockito 版本兼容线一致);或
-
升级 Byte Buddy / Mockito 至支持 Java 25 的版本(
pom.xml显式提升byte-buddy+byte-buddy-agent,或升 mockito-core);或 -
临时绕过:为 Surefire 设置
-Dnet.bytebuddy.experimental=true(仅解燃眉)。
④ 关键输出摘录(stdout,≤ 30 行)
[test.mjs] 1/5 setup test db
[setup-test-db] done — schema will be applied by Flyway when Spring Boot starts
[test.mjs] 2/5 build
[test.mjs] 3/5 lint
[test.mjs] 4/5 unit + integration
Java : 25
JVM vendor version : 25.0.2
[ERROR] UsrAuthServiceImplTest.setUp:54 Mockito
Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil.
Byte Buddy could not instrument all classes within the mock's type hierarchy
Caused by: java.lang.IllegalArgumentException: Java 25 (69) is not supported by the
current version of Byte Buddy which officially supports Java 22 (66) -
update Byte Buddy or set net.bytebuddy.experimental as a VM property
[ERROR] Tests run: 88, Failures: 0, Errors: 9, Skipped: 0 (本类聚合: 9/9 error)
[ERROR] Failed to execute goal ...maven-surefire-plugin:3.1.2:test (default-test) on project erp-backend
[test.mjs] FAIL (backend test) exit=1
===EXIT_CODE=1 END 2026-06-01 15:29:07 CST===
⑤ flake 识别参考(attempt 1 vs attempt 2 对比)
| 维度 | attempt 1 (r1) | attempt 2 (r2) |
|---|---|---|
| 结论 | 🔴 RED, exit=1 | 🔴 RED, exit=1 |
| Tests run | 125 | 125 |
| Errors | 9 | 9 |
| 失败类 |
UsrAuthServiceImplTest(9/9) |
UsrAuthServiceImplTest(9/9) |
| 失败用例集合 | 同下 9 条 | 完全相同的 9 条 |
| 根因 | JDK25 / Byte Buddy 不兼容 | 同一根因,逐字一致 |
判定:非 flake。 两次 attempt 结果 100% 一致(同样 9 条用例、同一 setUp:54、同一 Byte Buddy Java 25 (69) not supported 异常),确定性失败,与时序 / 网络 / 数据无关。属构建工具链版本不兼容,需上层按 ③ 修复后再 retry。每个 attempt 独立成文,本文件 usr-test-gate-r2.md 不覆盖 usr-test-gate-r1.md。