with one click
test-unit
单元测试代码生成。当用户需要为代码生成单元测试、测试用例、Mock对象,或询问"帮我写单元测试"、"生成测试代码"时使用。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
单元测试代码生成。当用户需要为代码生成单元测试、测试用例、Mock对象,或询问"帮我写单元测试"、"生成测试代码"时使用。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
设计文档评审。当用户需要评审设计文档质量、检查设计合理性、发现设计缺陷,或询问"帮我评审设计文档"、"检查设计质量"时使用。
需求文档评审。当用户需要评审需求文档质量、检查需求完整性、发现需求缺陷,或询问"帮我评审需求文档"、"检查需求质量"时使用。
需求分析文档生成。当用户需要分析需求、生成需求规格说明书、需求文档,或询问“帮我分析这个需求”、“写需求文档”时使用。
现有项目技术架构分析。当用户需要分析老项目技术栈、接手新项目、技术调研,或询问"分析这个项目的技术架构"、"梳理技术栈"时使用。
数据库表结构导出。当用户需要导出数据库结构、生成表结构DDL,或询问"导出表结构"、"导出数据库DDL"时使用。
系统功能设计文档生成。当用户需要生成设计文档、系统设计、技术方案,或询问"帮我写设计文档"、"生成技术设计"时使用。
| name | test-unit |
| description | 单元测试代码生成。当用户需要为代码生成单元测试、测试用例、Mock对象,或询问"帮我写单元测试"、"生成测试代码"时使用。 |
测试代码注释和测试描述必须使用中文,包括 @DisplayName 测试名称、方法注释、场景说明等。
生成高质量的单元测试代码,包括测试用例设计、Mock 对象、断言验证等。
生成单元测试时,可以参考以下文档:
当用户提供待测代码(类/方法/模块),以及可选的设计文档路径或测试范围说明时,生成单元测试代码。
参考设计文档(可选):
design/gen 命令生成的设计文档/projectdocs/design/{project}_design_{timestamp}.md参考代码文件:
分段生成策略:
unit --class=UserService (只生成指定类的测试)unit --method=createUser (只生成指定方法的测试)unit --layer=service (只生成指定层的测试)unit --module=user (生成指定模块的所有测试)unit --scenario=normal,exception (只生成指定场景的测试)@Test
@DisplayName("测试描述")
void testMethod() {
// Arrange
// Act
// Assert
}
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
assertThat(result)
.isNotNull()
.hasSize(3)
.extracting(User::getName)
.containsExactly("Alice", "Bob", "Charlie");
@SpringBootTest
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
@DisplayName("创建用户 - 成功场景")
void testCreateUser_Success() {
// Arrange
UserDTO userDTO = new UserDTO();
userDTO.setName("Alice");
userDTO.setEmail("alice@example.com");
User savedUser = new User();
savedUser.setId(1L);
savedUser.setName("Alice");
when(userRepository.save(any(User.class)))
.thenReturn(savedUser);
// Act
Long userId = userService.createUser(userDTO);
// Assert
assertThat(userId).isEqualTo(1L);
verify(userRepository, times(1)).save(any(User.class));
}
@Test
@DisplayName("创建用户 - 邮箱重复")
void testCreateUser_EmailExists() {
// Arrange
UserDTO userDTO = new UserDTO();
userDTO.setEmail("alice@example.com");
when(userRepository.existsByEmail("alice@example.com"))
.thenReturn(true);
// Act & Assert
assertThatThrownBy(() -> userService.createUser(userDTO))
.isInstanceOf(BusinessException.class)
.hasMessage("邮箱已存在");
verify(userRepository, never()).save(any(User.class));
}
@Test
@DisplayName("创建用户 - 参数为空")
void testCreateUser_NullParameter() {
// Act & Assert
assertThatThrownBy(() -> userService.createUser(null))
.isInstanceOf(IllegalArgumentException.class);
}
}
@Test
@DisplayName("查询用户 - 用户存在")
void testGetUser_UserExists() {
// 测试正常的业务流程
}
@Test
@DisplayName("分页查询 - 页码为0")
void testPageQuery_PageNumZero() {
// 测试边界值
}
@Test
@DisplayName("分页查询 - 每页大小为最大值")
void testPageQuery_MaxPageSize() {
// 测试边界值
}
@Test
@DisplayName("删除用户 - 用户不存在")
void testDeleteUser_UserNotFound() {
// 测试异常情况
}
@Test
@DisplayName("更新用户 - 数据库异常")
void testUpdateUser_DatabaseException() {
// 测试异常情况
}
@Test
@DisplayName("创建用户 - 参数为null")
void testCreateUser_NullParameter() {
// 测试空值处理
}
@Test
@DisplayName("查询用户 - 返回空列表")
void testQueryUsers_EmptyResult() {
// 测试空结果
}
// Mock Repository
@Mock
private UserRepository userRepository;
// Mock 外部服务
@Mock
private EmailService emailService;
// Mock Redis
@Mock
private RedisTemplate<String, Object> redisTemplate;
// 返回特定值
when(userRepository.findById(1L))
.thenReturn(Optional.of(user));
// 返回空值
when(userRepository.findById(999L))
.thenReturn(Optional.empty());
// 抛出异常
when(userRepository.save(any()))
.thenThrow(new DataAccessException("数据库异常"));
// 验证方法被调用
verify(userRepository).save(any(User.class));
// 验证调用次数
verify(emailService, times(2)).sendEmail(anyString());
// 验证从未调用
verify(userRepository, never()).delete(any());
// 验证调用顺序
InOrder inOrder = inOrder(userRepository, emailService);
inOrder.verify(userRepository).save(any());
inOrder.verify(emailService).sendEmail(anyString());
// JUnit 断言
assertEquals(expected, actual);
assertTrue(condition);
assertNotNull(object);
assertThrows(Exception.class, () -> method());
// AssertJ 断言(推荐)
assertThat(actual).isEqualTo(expected);
assertThat(condition).isTrue();
assertThat(object).isNotNull();
assertThatThrownBy(() -> method())
.isInstanceOf(Exception.class);
assertThat(list)
.isNotEmpty()
.hasSize(3)
.contains("Alice", "Bob")
.doesNotContain("Charlie");
assertThat(list)
.extracting(User::getName)
.containsExactly("Alice", "Bob", "Charlie");
assertThat(user)
.isNotNull()
.extracting(User::getName, User::getAge)
.containsExactly("Alice", 25);
assertThat(user)
.hasFieldOrPropertyWithValue("name", "Alice")
.hasFieldOrPropertyWithValue("age", 25);
指定为某个类生成测试。
示例:
test/unit --class=UserService
test/unit --class=OrderController
test/unit --class=ProductMapper
指定只为某个方法生成测试(需要配合 --class 使用)。
示例:
test/unit --class=UserService --method=createUser
test/unit --class=UserService --method=updateUser,deleteUser
指定为某个层级的所有类生成测试。
可用层级:
service - Service 层controller - Controller 层mapper - Mapper/DAO 层util - 工具类示例:
test/unit --layer=service
test/unit --layer=controller
test/unit --layer=mapper
指定为某个模块的所有类生成测试。
示例:
test/unit --module=user
test/unit --module=order
test/unit --module=product
指定只生成某些场景的测试用例,多个场景用逗号分隔。
可用场景:
normal - 正常场景exception - 异常场景boundary - 边界条件null - 空值处理示例:
test/unit --scenario=normal
test/unit --scenario=exception
test/unit --scenario=normal,exception
test/unit --scenario=normal,exception,boundary,null
可以组合多个参数使用:
# 为指定模块的指定层生成测试
test/unit --module=user --layer=service
# 为指定类生成指定场景的测试
test/unit --class=UserService --scenario=exception
# 为指定模块的指定层生成指定场景的测试
test/unit --module=order --layer=service --scenario=normal,exception
# 为指定类的指定方法生成测试
test/unit --class=UserService --method=createUser,updateUser
// 推荐:方法名_场景_预期结果
testCreateUser_EmailExists_ThrowsException()
testGetUser_UserNotFound_ReturnsNull()
testUpdateUser_ValidData_Success()
// 或使用 @DisplayName
@DisplayName("创建用户 - 邮箱已存在 - 抛出异常")
// 每个测试独立准备数据
@BeforeEach
void setUp() {
// 准备测试数据
}
@AfterEach
void tearDown() {
// 清理测试数据
}
--module 或 --layer 参数分段生成--scenario 参数只生成特定场景的测试