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

