JUnit 5 实践
实验目标
使用 JUnit 5 和 Mockito 编写完整的测试套件。
实验 1:单元测试
java
@ExtendWith(MockitoExtension.class)
class ProductServiceTest {
@Mock
private ProductRepository productRepository;
@InjectMocks
private ProductService productService;
@Test
void testFindById() {
Product product = new Product();
product.setId(1L);
product.setName("Test Product");
when(productRepository.findById(1L)).thenReturn(Optional.of(product));
Optional<Product> result = productService.findById(1L);
assertTrue(result.isPresent());
assertEquals("Test Product", result.get().getName());
}
@Test
void testCreateProduct() {
Product product = new Product();
product.setName("New Product");
when(productRepository.save(any(Product.class))).thenReturn(product);
Product saved = productService.save(product);
assertNotNull(saved);
assertEquals("New Product", saved.getName());
verify(productRepository, times(1)).save(product);
}
}实验 2:集成测试
java
@SpringBootTest
@AutoConfigureMockMvc
class ProductControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@Test
void testCreateProduct() throws Exception {
Product product = new Product();
product.setName("Test Product");
product.setPrice(new BigDecimal("99.99"));
mockMvc.perform(post("/api/products")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(product)))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name").value("Test Product"));
}
}验收标准
✅ 单元测试覆盖 Service 层
✅ 集成测试覆盖 Controller 层
✅ 测试覆盖率 > 80%
✅ 所有测试通过
返回第四章概览