Service 類中有一個 void save(String param, Date d1, Date d2) 方法,需要編寫單元測試驗證數據是否成功持久化。
@MockBean 或 Mockito.mock 模擬 Repository/DAO,避免依賴真實數據庫。service.save(...) 後,使用 verify(repository).save(argThat(...)) 斷言調用參數。@DataJpaTest 或 @SpringBootTest 配合內嵌數據庫(H2)進行真實落庫驗證。@ExtendWith(MockitoExtension.class)
class MyServiceTest {
@Mock
private MyRepository repository;
@InjectMocks
private MyService service;
@Test
void testSave() {
String str = "test";
Date d1 = new Date(), d2 = new Date();
service.save(str, d1, d2);
verify(repository).save(argThat(entity ->
entity.getStr().equals(str) &&
entity.getD1().equals(d1) &&
entity.getD2().equals(d2)
));
}
}
@DataJpaTest
class MyServiceIntegrationTest {
@Autowired
private MyRepository repository;
@Autowired
private MyService service;
@Test
void testSaveRealDb() {
service.save("real", new Date(), new Date());
List<MyEntity> list = repository.findAll();
assertEquals(1, list.size());
assertEquals("real", list.get(0).getStr());
}
}
對 void 保存方法,核心在於「驗證調用」而非「驗證返回值」。單元測試用 Mock 驗證參數傳遞,集成測試用真實數據庫驗證落庫,雙重保障代碼質量。