Mockito测试中ProcessFileService的save方法未被代码覆盖求助
问题原因及修正方案
你的测试没覆盖到save方法的核心原因是你Mock了ProcessFileService本身。Mockito创建的Mock对象不会执行真实方法逻辑,你用doNothing() stub了save方法,调用时只是走了Mock的空实现,根本没进到你写的save方法里,自然没有代码覆盖。
正确的做法是实例化真实的ProcessFileService对象,把你已经Mock好的两个Repository注入进去,这样调用save方法时才会执行真实的业务逻辑,同时验证Repository的方法是否被正确调用。
修正后的测试类代码
@ExtendWith(MockitoExtension.class) public class ProcessFileServiceTest { @Mock private ProcessFileRepository processFileRepository; @Mock private ProcessRunRepository processRunRepository; // 用@InjectMocks让Mockito自动把Mock的Repository注入到真实的Service实例中 @InjectMocks private ProcessFileService processFileService; @Test void processSave() { // 1. 准备测试数据 ProcessRun processRun = new ProcessRun(); processRun.setEndDateTime("30/08/2022"); processRun.setNumFilesFailed(1L); processRun.setNumFilesProcessed(1L); processRun.setNumFilesTransferred(1L); processRun.setStartDateTime("30/08/2022"); ProcessFile processFile = new ProcessFile(); processFile.setCurrentRetryAttempt(1); processFile.setFileName("file.txt"); processFile.setSuccessfulYN(true); processFile.setTransferDateTime("30/08/2022"); List<ProcessFile> processFiles = new ArrayList<>(); processFiles.add(processFile); // 2. 调用真实的save方法 processFileService.save(processRun, processFiles); // 3. 验证Repository的方法是否被正确调用 verify(processRunRepository, times(1)).save(processRun); verify(processFile).setProcessRun(processRun); verify(processFileRepository, times(1)).save(processFile); } }
关键说明
@InjectMocks:Mockito会自动将标注了@Mock的Repository注入到ProcessFileService实例中,替代原来的@Autowired依赖。- 调用真实Service的
save方法:这样才会执行你编写的业务逻辑,包括循环设置ProcessRun关联关系、调用两个Repository的save方法。 - 验证Repository的方法:测试Service的核心是验证它是否正确调用了依赖的Repository方法,而不是验证Service自身方法的调用次数(这没有实际测试意义)。
内容的提问来源于stack exchange,提问作者clinton samson
相关产品推荐
相关产品推荐

