关于 java-testing
面向 Java 开发者的测试技能,涵盖单元测试与集成测试,涉及 JUnit 5、Mockito、AssertJ、Spring Boot Test、Testcontainers、TDD 和覆盖率实践。
主要功能
- 01JUnit 5 测试模式
- 02Mockito 模拟与验证
- 03AssertJ 断言
- 04Spring Boot 集成测试
- 05Testcontainers 设置
- 06TDD 与覆盖率策略
适用场景
- 01编写 Java 单元测试
- 02模拟依赖并验证调用
- 03测试 API 和数据库
- 04排查不稳定或失败的测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pluginagentmarketplace/ custom-plugin-java --skill java-testing安装后在 Claude Code 中输入/java-testing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/config.yamlschema.jsonreferences/GUIDE.mdPATTERNS.mdscripts/validate.py详细介绍
Java 测试技能
使用现代测试实践为 Java 应用编写全面的测试。
概述
本技能涵盖使用 JUnit 5、Mockito、AssertJ 进行 Java 测试,以及使用 Spring Boot Test 和 Testcontainers 进行集成测试。包含 TDD 模式和测试覆盖率策略。
何时使用此技能
在以下情况下使用:
- 使用 JUnit 5 编写单元测试
- 使用 Mockito 创建模拟对象
- 使用 Testcontainers 编写集成测试
- 实施 TDD/BDD 实践
- 提高测试覆盖率
涵盖主题
JUnit 5
- @Test、@Nested、@DisplayName
- 使用数据源的 @ParameterizedTest
- 生命周期注解
- 扩展和自定义注解
Mockito
- @Mock、@InjectMocks、@Spy
- 桩件设置(when/thenReturn)
- 验证(verify、times)
- BDD 风格(given/willReturn)
AssertJ
- 流式断言
- 集合断言
- 异常断言
- 自定义断言
集成测试
- @SpringBootTest 切片
- Testcontainers 设置
- 用于 API 的 MockMvc
- 数据库测试
快速参考
// Unit Test with Mockito
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
@DisplayName("Should find user by ID")
void shouldFindUserById() {
// Given
User user = new User(1L, "John");
given(userRepository.findById(1L)).willReturn(Optional.of(user));
// When
Optional<User> result = userService.findById(1L);
// Then
assertThat(result)
.isPresent()
.hasValueSatisfying(u ->
assertThat(u.getName()).isEqualTo("John"));
then(userRepository).should().findById(1L);
}
}
// Parameterized Test
@ParameterizedTest
@CsvSource({
"[email protected], true",
"invalid-email, false",
"'', false"
})
void shouldValidateEmail(String email, boolean expected) {
assertThat(validator.isValid(email)).isEqualTo(expected);
}
// Integration Test with Testcontainers
@Testcontainers
@SpringBootTest
class OrderRepositoryIT {
@Container
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:15");
@DynamicPropertySource
static void configure(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Autowired
private OrderRepository repository;
@Test
void shouldPersistOrder() {
Order saved = repository.save(new Order("item", 100.0));
assertThat(saved.getId()).isNotNull();
}
}
// API Test with MockMvc
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void shouldReturnUser() throws Exception {
given(userService.findById(1L))
.willReturn(Optional.of(new User(1L, "John")));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("John"));
}
}
测试数据构建器
public class UserTestBuilder {
private Long id = 1L;
private String name = "John Doe";
private String email = "[email protected]";
private boolean active = true;
public static UserTestBuilder aUser() {
return new UserTestBuilder();
}
public UserTestBuilder withName(String name) {
this.name = name;
return this;
}
public UserTestBuilder inactive() {
this.active = false;
return this;
}
public User build() {
return new User(id, name, email, active);
}
}
// Usage
User user = aUser().withName("Jane").inactive().build();
覆盖率目标
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
故障排查
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Mock 不起作用 | 缺少 @ExtendWith | 添加 MockitoExtension |
| 测试中出现 NPE | Mock 未初始化 | 检查 @InjectMocks |
| 测试不稳定 | 共享状态 | 隔离测试数据 |
| 上下文加载失败 | 缺少 Bean | 使用 @MockBean |
调试检查清单
□ Run single test in isolation
□ Check mock setup matches invocation
□ Verify @BeforeEach setup
□ Review @Transactional boundaries
□ Check for shared mutable state
用法
Skill("java-testing")
相关技能
java-testing-advanced- 高级模式java-spring-boot- Spring 测试切片
评论
支持 Markdown