测试日期: 2026-03-17 | 测试用例: Java + Vue 常见陷阱代码
| 风险 | 文件 | 行号 | 类型 | 问题描述 | 改进建议 |
|---|---|---|---|---|---|
| P0 | UserService.java | L14 | 空指针 | 链式调用 user.getDepartment().getName() 可能导致 NPE |
逐级判空或使用 Optional |
| P0 | UserService.java | L20 | 并发修改 | for-each 循环中 users.remove(user) 会抛出 ConcurrentModificationException |
使用 Iterator 或 users.removeIf() |
| P1 | UserService.java | L27 | 字符串比较 | role == "ADMIN" 永远返回 false,应使用 equals() |
改为 "ADMIN".equals(role) |
| P2 | UserService.java | L9 | 不可变集合 | .toList() 返回不可变列表,调用方无法修改 |
如需可变列表,使用 new ArrayList<>(...) |
| 风险 | 文件 | 行号 | 类型 | 问题描述 | 改进建议 |
|---|---|---|---|---|---|
| P0 | UserList.vue | L5 | v-for key | 使用 index 作为 key,数组重排时会导致渲染错误 |
使用唯一 ID: :key="user.id" |
| P0 | UserList.vue | L10 | v-for key | v-for 缺少 key 属性 | 添加 :key="user.id" |
| P0 | UserList.vue | L35 | 响应式失效 | 直接修改数组索引 users[index].name = newName,视图不会更新 |
使用 splice 或触发响应式更新 |
| P0 | UserList.vue | L41 | 响应式失效 | 直接修改对象属性 user.age = age,视图不会更新 |
使用 Vue.set() 或对象替换 |
| P0 | UserList.vue | L25 | 计算属性 | 计算属性中修改数据 this.users.reverse() 会导致无限循环 |
使用 method 或 getter 中避免副作用 |
| P1 | UserList.vue | L46 | 内存泄漏 | setInterval 未清理,组件销毁后仍会执行 | 在 beforeDestroy 中调用 clearInterval |
| P1 | UserList.vue | L57 | 生命周期 | 在 created 中操作 DOM,可能失败 | 移至 mounted 钩子 |
| 指标 | 原版 (skills_bak) | 优化版 (当前) | 变化 |
|---|---|---|---|
| 主文件行数 | 127 | 147 | +20 |
| 主文件字节 | 3,121 | 4,254 | +1,133 |
| references 拆分 | 无 | 3 个文件 | ✅ 新增 |
| Vue 检查能力 | 无 | 15+ 项 | ✅ 新增 |
| 前后端分表输出 | 否 | 是 | ✅ 改进 |
skills/code-reviewer/test-cases/UserService.java - Java 后端测试代码skills/code-reviewer/test-cases/UserList.vue - Vue 前端测试代码优化版 code-reviewer 技能成功识别了测试代码中的所有常见陷阱:
通过 references 拆分,实现了按需加载检查清单,提升了灵活性和维护性。