Skip to content

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%
✅ 所有测试通过

返回第四章概览

用心记录每一步成长