如何Mock被测类内部方法?Mockito模拟失效问题解决
问题原因与解决方案
你遇到的核心问题是:@InjectMocks注入的是Test类的真实实例,Mockito无法直接mock真实对象的方法,所以你写的when(service.methodtWhichNeedMock(...)).thenReturn(...)会先执行原方法逻辑,再完成存桩,导致原代码依然被执行。
另外先纠正你代码里的拼写错误:mainMethod中调用的methdotWhichNeedMock是笔误,实际方法名是methodtWhichNeedMock,这个错误会导致编译或运行异常,先修正原类:
class Test { public String mainMethod() { // 修正方法名拼写 String test = methodtWhichNeedMock("Hello", "World"); return test; } public String methodtWhichNeedMock(String s1, String s2) { return s1 + s2; } }
下面是两种可行的解决方式:
方式一:使用@Spy实现部分Mock
@Spy会创建真实对象的包装类,默认执行原方法,但通过doReturn...when语法可以跳过原方法直接返回指定值:
@ExtendWith(MockitoExtension.class) class TestClass { @Spy Test service; @Test void mainMethod() { // 注意语法顺序:doReturn在前,避免触发原方法执行 doReturn("new String").when(service).methodtWhichNeedMock("Hello", "World"); assertEquals("new String", service.mainMethod()); } }
如果不需要严格匹配参数,也可以用通配符:
doReturn("new String").when(service).methodtWhichNeedMock(anyString(), anyString());
方式二:使用CALLS_REAL_METHODS创建Mock对象
通过Mockito.mock创建Mock对象时,指定CALLS_REAL_METHODS规则,让对象默认执行真实方法,仅对指定方法进行Mock:
@ExtendWith(MockitoExtension.class) class TestClass { @Test void mainMethod() { // 创建一个默认执行真实方法的Mock对象 Test service = Mockito.mock(Test.class, Mockito.CALLS_REAL_METHODS); // Mock目标方法 doReturn("new String").when(service).methodtWhichNeedMock("Hello", "World"); assertEquals("new String", service.mainMethod()); } }
内容的提问来源于stack exchange,提问作者Jeyzihno
相关产品推荐
相关产品推荐

