用途:为 Spring Boot 项目提供测试分层(测试金字塔)的编写规范,适用于编写任意类型的测试——单元测试、切片测试或集成测试。
主要能力:
- 测试结构比例:单元测试(快速、无 Spring 上下文、mock 依赖)约 70%;切片测试(部分 Spring 上下文,如 @WebMvcTest、@DataJpaTest)约 20%;集成测试(完整上下文 + 通过 Testcontainers 使用真实数据库)约 10%。
- 单元测试:使用 @ExtendWith(MockitoExtension.class) 配合 @Mock、@InjectMocks,采用 Given/When/Then 结构,用 AssertJ 断言,用 verify 校验交互。
- 控制器切片测试:@WebMvcTest 配合 MockMvc、ObjectMapper,使用 @MockitoBean(Spring Boot 3.4+ 中 @MockBean 已弃用),控制器测试需加 @WithMockUser,否则安全过滤器会拦截请求。
- 仓库切片测试:@DataJpaTest 配合 @AutoConfigureTestDatabase(replace = Replace.NONE) 与 @Import(TestcontainersConfig.class) 使用真实数据库。
- 集成测试:@SpringBootTest(webEnvironment = RANDOM_PORT) 配合 TestRestTemplate,通过 @TestConfiguration 与 @ServiceConnection 复用 PostgreSQL 容器。
- 命名规范:methodName_condition_expectedBehavior,例如 createOrder_whenItemsAvailable_shouldSaveOrder()。
必要用法:需引入 spring-boot-testcontainers 与 org.testcontainers:postgresql 依赖(test 作用域)。
常见问题:不要对所有测试都用 @SpringBootTest,切片测试更快;@DataJpaTest 不要用 H2 内存库,应使用 Testcontainers 保证准确性;用 @MockitoBean 替代已弃用的 @MockBean(spy 用 @MockitoSpyBean);用注解替代 Mockito.mock();控制器测试勿忘 @WithMockUser;断言使用 AssertJ 而非 JUnit 的 assertEquals;测试命名避免 test_createOrder() 形式。
限制:资料未提供具体版本兼容范围、性能数据或收费信息。