研发协作
Java 应用测试:编写 JUnit…
为 Java/Spring Boot 项目补充单元测试、mock、参数化测试、API 测试、Testcontainers 集成测试和覆盖率门槛时适用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
Java 应用测试:编写 JUnit 5特定
解决思路
- 用 @Test 标记 JUnit 5 测试方法。
- 用 @Nested 组织嵌套测试类/测试结构。
- 用 @DisplayName 为测试类和方法写可读描述。
- 用 @ParameterizedTest 配合参数源(如 @CsvSource)执行同一逻辑的多组输入测试;例如 @CsvSource({"valid@email.com, true", "invalid-email, false", "'', false"}),然后 assertThat(validator.isValid(email)).isEqualTo(expected)。
- 用 JUnit 5 生命周期注解(如 @BeforeEach 等)管理测试前置/后置逻辑。
- 用 JUnit 5 Extensions 和自定义注解扩展测试行为、复用通用测试配置。
- 用 @ExtendWith(MockitoExtension.class) 启用 Mockito 注解支持。
- 用 @Mock 创建 mock 依赖。
- 用 @InjectMocks 把 mock 注入被测对象。
- 用 @Spy 创建部分 mock。
- 用 Mockito stubbing:when(...).thenReturn(...) 为依赖方法打桩。
- 用 Mockito verification:verify(...)、times(...) 校验调用次数和参数。
- 用 BDD 风格 given(...).willReturn(...)、then(...).should() 编写 given/when/then 测试。
- 在 given/when/then 结构中:Given 准备测试数据和 mock,When 调用被测方法,Then 用 AssertJ 断言并用 then(...).should() 验证交互。
- 用 AssertJ fluent assertions 做链式断言,如 assertThat(result).isPresent().hasValueSatisfying(u -> assertThat(u.getName()).isEqualTo("John"))。
- 用 AssertJ collection assertions 校验集合内容、顺序、大小等。
- 用 AssertJ exception assertions 校验异常类型、消息等。
- 用 AssertJ custom assertions 封装领域对象断言。
- 用 @SpringBootTest 切片(如 @WebMvcTest(UserController.class))只加载需要的 Spring 上下文。
- 用 Testcontainers:在 @Testcontainers 测试类中声明 @Container static PostgreSQLContainer<>("postgres:15") 等容器。
- 用 @DynamicPropertySource 将容器连接信息注入 Spring 配置,例如 registry.add("spring.datasource.url", postgres::getJdbcUrl)、registry.add("spring.datasource.username", postgres::getUsername)、registry.add("spring.datasource.password", postgres::getPassword)。
- 做数据库/Repository 集成测试:@Autowired 注入 repository,保存实体后断言持久化结果,如 assertThat(saved.getId()).isNotNull()。
- 用 MockMvc 测试 API:@Autowired MockMvc,用 @MockBean 替换依赖,执行 mockMvc.perform(get("/api/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("John"))。
- 用 Test Data Builder 构建测试数据:定义 UserTestBuilder,为 id/name/email/active 等字段设置默认值。
- 在 Test Data Builder 中提供静态入口 aUser() 创建 builder。
- 在 Test Data Builder 中提供 withName(...)、inactive() 等链式方法覆盖字段,并提供 build() 生成对象。
- 按 aUser().withName("Jane").inactive().build() 的方式构建可读、可复用的测试数据。
- 配置 JaCoCo 覆盖率门槛:在 rules/rule/limits/limit 中设置 element=BUNDLE、counter=LINE、value=COVEREDRATIO、minimum=0.80 等。
- 遇到 Mock 不生效时,检查并添加 @ExtendWith(MockitoExtension.class)。
- 遇到测试中 NPE 时,检查 @InjectMocks 和 mock 初始化。
- 遇到 flaky test 时,隔离测试数据,避免共享状态。
- 遇到 Spring 上下文启动失败/缺少 bean 时,使用 @MockBean 替换缺失 bean。
- 调试时单独运行单个测试。
- 调试时检查 mock setup 是否匹配实际调用。
- 调试时验证 @BeforeEach setup。
- 调试时审查 @Transactional 边界。
- 调试时检查共享可变状态。
适用边界 · 注意事项
- 非 Java/JVM 项目不适用。
- 项目未采用 JUnit 5、Mockito、AssertJ、Spring Boot Test 或 Testcontainers,或环境无法运行 Docker 时,不能直接套用对应做法。
- 需要纯浏览器 E2E 测试、契约测试或非 JUnit 框架的特定用法时,本内容未覆盖完整方案。