JUnit 4测试通过但代码覆盖率为0%,求排查原因
问题原因及解决方案
核心问题
你把要测试的AuthService本身用@Mock注解声明成了Mock对象——Mockito生成的Mock对象只会执行你通过when(...)定义的模拟逻辑,不会运行真实的方法代码,自然不会产生任何代码覆盖率。
修复步骤
- 调整注解配置:把
AuthService的@Mock改成@InjectMocks,这样Mockito会自动将Mock的StudentBean注入到真实的AuthService实例中,让你能测试真实的业务逻辑。 - 重构测试逻辑:移除对
authService.getUsers()和authService.checkIfTokenExpired()的模拟,让真实方法执行;只模拟依赖的StudentBean行为,同时控制checkIfTokenExpired()中的时间逻辑(避免系统时间导致测试不稳定)。
修复后的测试代码示例
@Mock StudentBean studentBean; @InjectMocks AuthService authService; // 用真实实例,自动注入Mock的依赖 @Before public void initMocks() { MockitoAnnotations.initMocks(this); } @Test public void testGetUsers_WhenUsersIsNullAndTokenNotExpired() { // 模拟studentBean.getUsers()返回null Mockito.when(studentBean.getUsers()).thenReturn(null); // 用Spy控制setExpiryTime的返回值,让checkIfTokenExpired返回false LocalDateTime futureExpiryTime = LocalDateTime.now().plusHours(1); AuthService spyAuthService = Mockito.spy(authService); Mockito.doReturn(futureExpiryTime).when(spyAuthService).setExpiryTime(); // 调用真实方法 spyAuthService.getUsers(); // 验证fetchStudents被触发 Mockito.verify(spyAuthService).fetchStudents(); // 模拟fetchStudents后studentBean的返回值,验证最终结果 Mockito.when(studentBean.getUsers()).thenReturn("APSAPS"); assertEquals("APSAPS", spyAuthService.getUsers()); }
补充说明
- 如果
setExpiryTime是私有方法,可以结合Mockito Spy的doAnswer,或者用PowerMock模拟LocalDateTime.now(),确保checkIfTokenExpired()的返回值可预期。 - 测试时要覆盖不同分支:比如
studentBean.getUsers()不为null、token过期等场景,确保所有代码路径都被验证。
内容的提问来源于stack exchange,提问作者Andres
相关产品推荐
相关产品推荐

