mcpField
J
java-testing

java-testing

github.com/pluginagentmarketplace测试与质量41904 次安装42 周前更新
代码仓库

关于 java-testing

面向 Java 开发者的测试技能,涵盖单元测试与集成测试,涉及 JUnit 5、Mockito、AssertJ、Spring Boot Test、Testcontainers、TDD 和覆盖率实践。

主要功能

  1. 01JUnit 5 测试模式
  2. 02Mockito 模拟与验证
  3. 03AssertJ 断言
  4. 04Spring Boot 集成测试
  5. 05Testcontainers 设置
  6. 06TDD 与覆盖率策略

适用场景

  1. 01编写 Java 单元测试
  2. 02模拟依赖并验证调用
  3. 03测试 API 和数据库
  4. 04排查不稳定或失败的测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-java --skill java-testing

安装后在 Claude Code 中输入/java-testing确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
config.yaml
schema.json
references/
GUIDE.md
PATTERNS.md
scripts/
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
测试中出现 NPEMock 未初始化检查 @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