You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit 4测试通过但代码覆盖率为0%,求排查原因

问题原因及解决方案

核心问题

你把要测试的AuthService本身用@Mock注解声明成了Mock对象——Mockito生成的Mock对象只会执行你通过when(...)定义的模拟逻辑,不会运行真实的方法代码,自然不会产生任何代码覆盖率。

修复步骤

  1. 调整注解配置:把AuthService的@Mock改成@InjectMocks,这样Mockito会自动将Mock的StudentBean注入到真实的AuthService实例中,让你能测试真实的业务逻辑。
  2. 重构测试逻辑:移除对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:40:38