Skip to content

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
ABSTRACTabstractfalse
NATIVEnativefalse
GETTERgetterfalse
SETTERsetterfalse
MAINmainfalse
EQUALSequalstrue
TOSTRINGtoStringtrue
HASHCODEhashCodetrue

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 — 优化 import
  • stubMockMethodCallsReturnValues — Mock 方法返回值
  • ignoreUnusedProperties — 忽略未使用属性

3. Context 子包 — 代码结构分析

3.1 Domain 子包 — 领域模型

字符串数职责
Type450类型模型 — Java 类型完整表示(最大类)
Method246方法模型 — 方法签名、参数、返回值
Field155字段模型 — 字段类型、名称、注解
Param73参数模型 — 方法参数
Reference62引用模型 — 类型引用
MethodCall43方法调用模型
StaticMethodCall44静态方法调用模型
Node41AST 节点模型
MethodCallArgument25方法调用参数
SyntheticParam30合成参数(编译器生成)

Type (450 strings) — 类型系统核心:

  • 支持基本类型、包装类型、泛型、数组、集合、Map
  • 支持嵌套类型解析
  • 支持类型维度(dimensions)

Annotation 子包:

字符串数职责
DiClassAnnotationEnum77DI 类注解枚举 — @Component, @Service, @Repository 等
DiFieldAnnotationEnum75DI 字段注解枚举 — @Autowired, @Resource, @Inject 等
SpringFieldAnnotationEnum65Spring 字段注解枚举 — @Value, @Qualifier 等

3.2 Resolved 子包 — 解析结果

字符串数职责
ResolveComponents180解析组件 — 解析的依赖组件
ResolvedBranch120解析分支 — 条件分支解析
ResolvedMethodCall66解析方法调用
ResolveVarible49解析变量
MethodCallArg31方法调用参数
ResolvedReference22解析引用

3.3 Service 子包 — 测试构建

字符串数职责
JavaTestBuilderImpl956Java 测试构建实现 — 最大类
TestBuilderImpl237测试构建实现
LangTestBuilderFactory56语言测试工厂
TestBuilder55测试构建接口
LangTestBuilder19语言测试构建接口

JavaTestBuilderImpl (956 strings) — 整个 template 包中最大的类:

  • 3 个匿名内部类($1, $2, $3)
  • 实现 Java 特定的单测代码生成
  • 支持 JUnit 4/5、TestNG
  • 支持 Mockito、PowerMock、EasyMock
  • 处理 Spring DI 注入
  • 生成 setup/teardown 方法
  • 生成测试方法和断言

4. Builder 子包 — Mock 构建

字符串数职责
MethodFactory634方法工厂 — 创建 Mock 方法
MockitoMockBuilder385Mockito Mock 构建器
MethodReferencesBuilder283方法引用构建器
MockBuilderFactory146Mock 构建器工厂
PowerMockBuilder81PowerMock 构建器
MockBuilder26Mock 构建器接口

MethodFactory (634 strings) — 第二大类:

  • 创建各种类型的 Mock 方法
  • 处理方法参数和返回值
  • 生成 when/thenReturn/thenThrow 代码

MockBuilderFactory — 根据设置选择 Mock 框架:

  • UnitTestMockEnum.POWER_MOCK → PowerMockBuilder
  • UnitTestMockEnum.MOCKITO → MockitoMockBuilder

5. Fileloader 子包 — 模板文件加载

字符串数职责
FTManager395文件模板管理器 — 管理模板文件
FileTemplatesLoader368模板加载器 — 加载模板文件
UnitTemplateManager339单元模板管理器
TemplateRegistry128模板注册表
FileTemplateContext101文件模板上下文
TemplateResourceLoader99模板资源加载器
UnitFileTemplate58单元文件模板
TemplateDescriptor73模板描述
FileTemplateLoadResult33模板加载结果
TemplateRole28模板角色

6. Generator 子包 — 测试文件生成

字符串数职责
CreateTestFileTask801创建测试文件任务 — 第三大类
CreateTestMethodTask539创建测试方法任务
TargetDirectoryLocator289目标目录定位器
TestFileTemplateUtil190测试文件模板工具
ProcessErrorFileAnalyzer150错误文件分析器
GeneratedClassNameResolver157生成类名解析器
GeneratorTemplateConfig105生成器模板配置
GeneratorFileConfig95生成器文件配置
CacheFileTemplate56缓存文件模板
GeneratorProcess47生成器流程
ClassNameSelection24类名选择

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 子包 — 模板请求

字符串数职责
TemplateRequestService893模板请求服务 — 与 Agent 通信
DataUtils182数据工具
CaseResult165用例结果
FileRequestDto73文件请求 DTO
MethodRequestResult61方法请求结果
TemplateTestDto40模板测试 DTO
CaseBranch85用例分支
CaseParam39用例参数
TypeEnum42类型枚举
TemplateTestPromptDto29模板测试 Prompt DTO
ToMockMethod26Mock 方法

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. 关键发现

  1. JavaTestBuilderImpl 最大: 956 strings,是整个 template 包中最大的类,实现 Java 特定的单测代码生成,支持 JUnit 4/5、TestNG、Mockito、PowerMock。

  2. TemplateRequestService 第二大: 893 strings,与 Agent 通信请求 AI 辅助生成测试用例,发送 CODE_TEST_MAKE_CASE_JAVA 命令。

  3. CreateTestFileTask 第三大: 801 strings,4 个匿名内部类,处理文件创建的完整流程。

  4. MethodFactory 第四大: 634 strings,创建各种类型的 Mock 方法,生成 when/thenReturn/thenThrow 代码。

  5. Type 模型 450 strings: 类型系统核心,支持基本类型、包装类型、泛型、数组、集合、Map 的完整表示。

  6. 3 个 DI 注解枚举: DiClassAnnotationEnum(类级)、DiFieldAnnotationEnum(字段级)、SpringFieldAnnotationEnum(Spring 特定),覆盖 Spring DI 的主要注解。

  7. 8 个排除方法: ExcludeMethodEnum 定义 8 种不应生成单测的方法类型(abstract, native, getter, setter, main, equals, toString, hashCode)。

  8. AssertUtil 中文: 包含中文字符串 "期望返回值是空,不进行断言" 和 "未知的类型",说明模板系统有中文错误提示。

  9. Velocity 模板引擎: 使用 Apache Velocity 作为模板引擎,VelocityInitializer 负责初始化。

  10. 双生成模式: 本地模板生成(JavaTestBuilderImpl)+ AI 辅助生成(TemplateRequestService → Agent),两种模式互补。

  11. 80+ 个类: template 包是 iFlyCode 中最大的包之一,覆盖从代码分析到测试生成的完整流程。

  12. CodeRefactorUtil 使用反射: createGroovyImport() 使用反射创建 Groovy import,说明支持 Groovy 测试代码生成。

本项目仅供学习研究,逆向分析内容归原厂商所有。