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

Mockito测试用例中方法mock不生效无法返回指定值问题求助

错误原因

  • 你创建的Mock对象仅在测试类上下文中生效,AService的ser()方法内部通过new A()创建了全新的原生A类实例,完全没有用到你Mock的对象,因此调用的始终是原方法的逻辑,返回1L。
  • 补充注意点:1l小写L的写法容易和数字1混淆,推荐统一用1L表示Long类型的字面量。

修正方案

步骤1:调整AService支持依赖注入(符合可测试代码规范,推荐做法)

将A实例作为成员变量通过构造方法注入,不要在方法内部自行创建实例:

package com.te;

public class AService {
    private IA a;

    // 通过构造方法传入依赖,外部可以传入Mock实例替换真实实现
    public AService(IA a) {
        this.a = a;
    }

    public void ser(){
        boolean d = a.getVal(1L) > 0;
        if(d){
            System.out.println("Inside If");
        }
    }
}

步骤2:调整测试类,传入Mock对象

@RunWith(MockitoJUnitRunner.class)
public class ATest {
    @Test
    public void test(){
        IA a = Mockito.mock(A.class);
        // 把Mock的实例注入到AService中
        AService s = new AService(a);
        Mockito.when(a.getVal(1L)).thenReturn(0L);
        s.ser();
    }
}

调整后运行测试不会打印Inside If,说明Mock已经生效,getVal返回了你指定的0L。

简化写法(使用Mockito注解)

也可以通过Mockito的注解自动注入依赖,简化代码:

@RunWith(MockitoJUnitRunner.class)
public class ATest {
    // 自动创建Mock实例
    @Mock
    private IA a;
    // 自动把上面的Mock实例注入到AService的对应成员变量中
    @InjectMocks
    private AService s;

    @Test
    public void test(){
        Mockito.when(a.getVal(1L)).thenReturn(0L);
        s.ser();
    }
}

特殊情况:无法修改AService代码

如果你确实不能调整AService的代码结构,可以引入PowerMock框架,Mocknew A()的构造方法返回你创建的Mock实例,不过这种方式会增加测试复杂度,非必要不推荐使用。

内容的提问来源于stack exchange,提问作者Thurms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 21:00:01