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

如何在JUnit中Mock @InjectMocks类中的Void方法?

解决Mock @InjectMocks类中void方法的问题

要忽略Maths类里addTest()的执行逻辑,你需要用Spy对象包装真实的Maths实例,同时让Mockito注入已Mock的Data依赖,具体有两种可行方式:

方式一:结合@Spy和@InjectMocks注解

修改测试类,给Maths字段同时添加@Spy和@InjectMocks注解,Mockito会自动创建Maths的Spy实例并注入Data Mock。之后用doNothing()来StubaddTest()方法:

@RunWith(MockitoJUnitRunner.class)
public class MathsTest{

  @Spy
  @InjectMocks
  private Maths maths;

  @Mock
  private Data data;

  @Test
  public void testGetData(){
     // Mock Data的方法
     Mockito.when(data.someMethod()).thenReturn("someValue");
     // 忽略addTest()的执行逻辑
     Mockito.doNothing().when(maths).addTest(Mockito.anyString());
     // 执行测试
     assertNotNull(maths.getData());
  }
}

注意:Spy对象默认会执行真实方法逻辑,只有被显式Stub的方法(比如这里的addTest())会走Mock逻辑,所以getData()依然会正常执行,不会被忽略——你之前用@Spy出错应该是误解了Spy的作用,它不会自动跳过所有方法,只有指定Stub的方法才会被替换。

方式二:手动创建Spy并注入依赖

如果不想用注解组合,也可以手动初始化Spy实例,再注入依赖:

@RunWith(MockitoJUnitRunner.class)
public class MathsTest{

  private Maths maths;

  @Mock
  private Data data;

  @Before
  public void setUp(){
    // 创建Maths的Spy实例
    maths = Mockito.spy(new Maths());
    // 注入Data Mock到Spy实例中
    MockitoAnnotations.openMocks(this);
  }

  @Test
  public void testGetData(){
     Mockito.when(data.someMethod()).thenReturn("someValue");
     Mockito.doNothing().when(maths).addTest(Mockito.anyString());
     assertNotNull(maths.getData());
  }
}

为什么之前的尝试失败?

  • 直接给Maths加@Spy但没StubaddTest():Spy默认执行真实方法,所以addTest()还是会跑原逻辑,你可能误以为Spy会跳过所有方法,其实不是。
  • 直接用doNothing()但Maths不是Mock/Spy:Mockito只能Stub Mock或Spy对象的方法,真实对象的方法无法被Stub,所以会报Stubbing错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:52:12