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
相关产品推荐
相关产品推荐

