iFlyCode Template 单测模板系统完整分析
版本: 3.4.2-222 | 分析日期: 2026-05-11
1. 概述
com/aicode/template/ 包是 iFlyCode 单元测试模板生成系统的完整实现,包含 80+ 个类,分布在 8 个子包中。该系统基于 Apache Velocity 模板引擎,使用 IntelliJ PSI 分析代码结构,自动生成 JUnit/TestNG 单元测试代码。
2. 核心类
2.1 TypeDictionary (359 strings) — 类型字典
路径: com/aicode/template/TypeDictionary职责: 类型字典 — 维护 Java 类型系统映射
功能: 管理类型之间的转换关系,包括基本类型、包装类型、集合类型、Map 类型的映射。
2.2 TestTemplateContextBuilder (345 strings) — 模板上下文构建
路径: com/aicode/template/TestTemplateContextBuilder职责: 模板上下文构建器 — 构建模板渲染所需的完整上下文
功能: 收集被测类的所有信息(方法、字段、依赖、注解),构建 Velocity 模板上下文。
2.3 TemplateGenerator (229 strings) — 模板生成器
路径: com/aicode/template/TemplateGenerator职责: 模板生成器 — 使用 Velocity 引擎生成测试代码
2.4 TestSubjectInspector (230 strings) — 测试对象检查
路径: com/aicode/template/TestSubjectInspector职责: 测试对象检查器 — 检查被测类是否适合生成单测
2.5 AssertUtil (258 strings) — 断言工具
路径: com/aicode/template/AssertUtil职责: 断言工具 — 生成 JUnit/TestNG 断言代码
关键常量:
J4_TEMPLATE— JUnit 4 模板J4_ASSERT— JUnit 4 断言J5_ASSERTIONS— JUnit 5 断言KONG_WORDS— 空值关键字KONG_LIST_WORDS— 空列表关键字NULL_KEY_WORDS— null 关键字BASIC_TYPES— 基本类型列表
关键方法:
assertResult()— 生成断言代码assertNull()— 生成 assertNull 断言arrayAssert()— 数组断言collectionAssert()— 集合断言mapAssert()— Map 断言jsonAssert()— JSON 断言entityAssert()— 实体断言isBasicType()— 是否基本类型
中文字符串: "期望返回值是空,不进行断言"、"未知的类型"
2.6 CodeRefactorUtil (186 strings) — 代码重构工具
路径: com/aicode/template/CodeRefactorUtil职责: 代码重构工具 — 处理 import 语句和代码重构
关键方法:
uncommentImports()— 取消 import 注释extractImportStatement()— 提取 import 语句createGroovyImport()— 创建 Groovy import(使用反射)
2.7 ExcludeMethodEnum (50 strings) — 排除方法枚举
路径: com/aicode/template/ExcludeMethodEnum职责: 排除方法枚举 — 定义不应生成单测的方法类型
枚举值:
| 枚举值 | 名称 | canWrite |
|---|---|---|
| ABSTRACT | abstract | false |
| NATIVE | native | false |
| GETTER | getter | false |
| SETTER | setter | false |
| MAIN | main | false |
| EQUALS | equals | true |
| TOSTRING | toString | true |
| HASHCODE | hashCode | true |
2.8 VelocityInitializer (57 strings) — Velocity 初始化
路径: com/aicode/template/VelocityInitializer职责: Velocity 引擎初始化 — 配置 Apache Velocity 模板引擎
2.9 FileTemplateConfig (55 strings) — 文件模板配置
路径: com/aicode/template/FileTemplateConfig职责: 文件模板配置 — 模板生成的配置选项
字段:
DEFAULT_MAX_RECURSION_DEPTH— 默认最大递归深度maxRecursionDepth— 最大递归深度reformatCode— 重新格式化代码replaceFqn— 替换全限定名optimizeImports— 优化 importstubMockMethodCallsReturnValues— Mock 方法返回值ignoreUnusedProperties— 忽略未使用属性
3. Context 子包 — 代码结构分析
3.1 Domain 子包 — 领域模型
| 类 | 字符串数 | 职责 |
|---|---|---|
| Type | 450 | 类型模型 — Java 类型完整表示(最大类) |
| Method | 246 | 方法模型 — 方法签名、参数、返回值 |
| Field | 155 | 字段模型 — 字段类型、名称、注解 |
| Param | 73 | 参数模型 — 方法参数 |
| Reference | 62 | 引用模型 — 类型引用 |
| MethodCall | 43 | 方法调用模型 |
| StaticMethodCall | 44 | 静态方法调用模型 |
| Node | 41 | AST 节点模型 |
| MethodCallArgument | 25 | 方法调用参数 |
| SyntheticParam | 30 | 合成参数(编译器生成) |
Type (450 strings) — 类型系统核心:
- 支持基本类型、包装类型、泛型、数组、集合、Map
- 支持嵌套类型解析
- 支持类型维度(dimensions)
Annotation 子包:
| 类 | 字符串数 | 职责 |
|---|---|---|
| DiClassAnnotationEnum | 77 | DI 类注解枚举 — @Component, @Service, @Repository 等 |
| DiFieldAnnotationEnum | 75 | DI 字段注解枚举 — @Autowired, @Resource, @Inject 等 |
| SpringFieldAnnotationEnum | 65 | Spring 字段注解枚举 — @Value, @Qualifier 等 |
3.2 Resolved 子包 — 解析结果
| 类 | 字符串数 | 职责 |
|---|---|---|
| ResolveComponents | 180 | 解析组件 — 解析的依赖组件 |
| ResolvedBranch | 120 | 解析分支 — 条件分支解析 |
| ResolvedMethodCall | 66 | 解析方法调用 |
| ResolveVarible | 49 | 解析变量 |
| MethodCallArg | 31 | 方法调用参数 |
| ResolvedReference | 22 | 解析引用 |
3.3 Service 子包 — 测试构建
| 类 | 字符串数 | 职责 |
|---|---|---|
| JavaTestBuilderImpl | 956 | Java 测试构建实现 — 最大类 |
| TestBuilderImpl | 237 | 测试构建实现 |
| LangTestBuilderFactory | 56 | 语言测试工厂 |
| TestBuilder | 55 | 测试构建接口 |
| LangTestBuilder | 19 | 语言测试构建接口 |
JavaTestBuilderImpl (956 strings) — 整个 template 包中最大的类:
- 3 个匿名内部类($1, $2, $3)
- 实现 Java 特定的单测代码生成
- 支持 JUnit 4/5、TestNG
- 支持 Mockito、PowerMock、EasyMock
- 处理 Spring DI 注入
- 生成 setup/teardown 方法
- 生成测试方法和断言
4. Builder 子包 — Mock 构建
| 类 | 字符串数 | 职责 |
|---|---|---|
| MethodFactory | 634 | 方法工厂 — 创建 Mock 方法 |
| MockitoMockBuilder | 385 | Mockito Mock 构建器 |
| MethodReferencesBuilder | 283 | 方法引用构建器 |
| MockBuilderFactory | 146 | Mock 构建器工厂 |
| PowerMockBuilder | 81 | PowerMock 构建器 |
| MockBuilder | 26 | Mock 构建器接口 |
MethodFactory (634 strings) — 第二大类:
- 创建各种类型的 Mock 方法
- 处理方法参数和返回值
- 生成 when/thenReturn/thenThrow 代码
MockBuilderFactory — 根据设置选择 Mock 框架:
UnitTestMockEnum.POWER_MOCK→ PowerMockBuilderUnitTestMockEnum.MOCKITO→ MockitoMockBuilder
5. Fileloader 子包 — 模板文件加载
| 类 | 字符串数 | 职责 |
|---|---|---|
| FTManager | 395 | 文件模板管理器 — 管理模板文件 |
| FileTemplatesLoader | 368 | 模板加载器 — 加载模板文件 |
| UnitTemplateManager | 339 | 单元模板管理器 |
| TemplateRegistry | 128 | 模板注册表 |
| FileTemplateContext | 101 | 文件模板上下文 |
| TemplateResourceLoader | 99 | 模板资源加载器 |
| UnitFileTemplate | 58 | 单元文件模板 |
| TemplateDescriptor | 73 | 模板描述 |
| FileTemplateLoadResult | 33 | 模板加载结果 |
| TemplateRole | 28 | 模板角色 |
6. Generator 子包 — 测试文件生成
| 类 | 字符串数 | 职责 |
|---|---|---|
| CreateTestFileTask | 801 | 创建测试文件任务 — 第三大类 |
| CreateTestMethodTask | 539 | 创建测试方法任务 |
| TargetDirectoryLocator | 289 | 目标目录定位器 |
| TestFileTemplateUtil | 190 | 测试文件模板工具 |
| ProcessErrorFileAnalyzer | 150 | 错误文件分析器 |
| GeneratedClassNameResolver | 157 | 生成类名解析器 |
| GeneratorTemplateConfig | 105 | 生成器模板配置 |
| GeneratorFileConfig | 95 | 生成器文件配置 |
| CacheFileTemplate | 56 | 缓存文件模板 |
| GeneratorProcess | 47 | 生成器流程 |
| ClassNameSelection | 24 | 类名选择 |
CreateTestFileTask (801 strings) — 4 个匿名内部类:
- 创建测试文件的主流程
- 处理文件冲突(DuplicateRule: COEXIST/OVERWRITE/SKIP)
- 使用 WriteCommandAction 确保 IntelliJ 文档修改线程安全
- 支持批量生成
CreateTestMethodTask (539 strings):
- 创建单个测试方法
- 处理方法参数 Mock
- 生成断言代码
TargetDirectoryLocator (289 strings) — 3 个匿名内部类:
- 定位测试文件的目标目录
- 遵循 Maven/Gradle 约定(src/test/java)
- 支持自定义测试目录
7. Request 子包 — 模板请求
| 类 | 字符串数 | 职责 |
|---|---|---|
| TemplateRequestService | 893 | 模板请求服务 — 与 Agent 通信 |
| DataUtils | 182 | 数据工具 |
| CaseResult | 165 | 用例结果 |
| FileRequestDto | 73 | 文件请求 DTO |
| MethodRequestResult | 61 | 方法请求结果 |
| TemplateTestDto | 40 | 模板测试 DTO |
| CaseBranch | 85 | 用例分支 |
| CaseParam | 39 | 用例参数 |
| TypeEnum | 42 | 类型枚举 |
| TemplateTestPromptDto | 29 | 模板测试 Prompt DTO |
| ToMockMethod | 26 | Mock 方法 |
TemplateRequestService (893 strings) — 整个 template 包中第二大的类:
- 与 Agent 通信请求 AI 生成测试用例
- 发送
CommandEnum.CODE_TEST_MAKE_CASE_JAVA命令 - 处理流式响应
- 构建
TemplateTestPromptDto包含被测代码上下文
8. 完整流程
1. 用户右键 → UnitTestAction / BatchUTGeneratorAction
│
├── TestSubjectInspector.inspect() — 检查被测类
│ ├── 解析 PSI 结构(Method, Field, Type)
│ ├── 过滤 ExcludeMethodEnum(abstract, native, getter, setter)
│ └── 检查 DiClassAnnotationEnum(@Component, @Service)
│
├── TestTemplateContextBuilder.build() — 构建模板上下文
│ ├── 收集方法信息 → Method 模型
│ ├── 收集字段信息 → Field 模型
│ ├── 解析依赖注入 → DiFieldAnnotationEnum
│ ├── 解析方法调用 → ResolvedMethodCall
│ └── 构建 Velocity Context
│
├── MockBuilderFactory.create() — 创建 Mock 构建器
│ ├── PowerMock → PowerMockBuilder
│ └── Mockito → MockitoMockBuilder
│ └── MethodFactory.create() — 创建 Mock 方法
│
├── JavaTestBuilderImpl.build() — 生成测试代码
│ ├── 生成 import 语句
│ ├── 生成类声明和注解
│ ├── 生成 setup 方法(@Before/@BeforeEach)
│ ├── 生成测试方法(@Test)
│ │ ├── Mock 设置
│ │ ├── 方法调用
│ │ └── AssertUtil.assertResult() — 生成断言
│ └── 生成 teardown 方法(@After/@AfterEach)
│
├── TemplateRequestService → Agent — AI 辅助生成
│ └── CommandEnum.CODE_TEST_MAKE_CASE_JAVA
│
└── CreateTestFileTask.run() — 写入测试文件
├── TargetDirectoryLocator.locate() — 定位目标目录
├── DuplicateRule 处理 — COEXIST/OVERWRITE/SKIP
└── WriteCommandAction — 线程安全写入9. 关键发现
JavaTestBuilderImpl 最大: 956 strings,是整个 template 包中最大的类,实现 Java 特定的单测代码生成,支持 JUnit 4/5、TestNG、Mockito、PowerMock。
TemplateRequestService 第二大: 893 strings,与 Agent 通信请求 AI 辅助生成测试用例,发送
CODE_TEST_MAKE_CASE_JAVA命令。CreateTestFileTask 第三大: 801 strings,4 个匿名内部类,处理文件创建的完整流程。
MethodFactory 第四大: 634 strings,创建各种类型的 Mock 方法,生成 when/thenReturn/thenThrow 代码。
Type 模型 450 strings: 类型系统核心,支持基本类型、包装类型、泛型、数组、集合、Map 的完整表示。
3 个 DI 注解枚举: DiClassAnnotationEnum(类级)、DiFieldAnnotationEnum(字段级)、SpringFieldAnnotationEnum(Spring 特定),覆盖 Spring DI 的主要注解。
8 个排除方法: ExcludeMethodEnum 定义 8 种不应生成单测的方法类型(abstract, native, getter, setter, main, equals, toString, hashCode)。
AssertUtil 中文: 包含中文字符串 "期望返回值是空,不进行断言" 和 "未知的类型",说明模板系统有中文错误提示。
Velocity 模板引擎: 使用 Apache Velocity 作为模板引擎,VelocityInitializer 负责初始化。
双生成模式: 本地模板生成(JavaTestBuilderImpl)+ AI 辅助生成(TemplateRequestService → Agent),两种模式互补。
80+ 个类: template 包是 iFlyCode 中最大的包之一,覆盖从代码分析到测试生成的完整流程。
CodeRefactorUtil 使用反射:
createGroovyImport()使用反射创建 Groovy import,说明支持 Groovy 测试代码生成。