如何调用Mock类的链式方法并解决MissingMethodInvocationException报错
异常根因
抛出org.mockito.exceptions.misusing.MissingMethodInvocationException的核心原因是Mockito默认不支持链式调用的深度Mock:mockedClass.method1()的默认返回值不是Mock对象,你直接对该返回值调用method2()不属于Mockito可拦截的Mock方法调用,因此触发异常。你之前用doReturn、spy未生效大概率是没有配合分层Mock逻辑使用。
可行解决方案
方案1:开启深度Stub(RETURNS_DEEP_STUBS)
创建Mock对象时指定深度Stub策略,Mockito会自动将链式调用的每一层返回值都封装为Mock对象,原有链式写法可直接生效:
// 初始化Mock时开启深度Stub配置 MockedClass mockedClass = Mockito.mock(MockedClass.class, Mockito.RETURNS_DEEP_STUBS); // 链式调用写法直接可用 when(mockedClass.method1().method2()).thenReturn(x);提示:该方案适合短链式调用场景,不建议滥用,避免Mock逻辑过于隐蔽难以排查。
方案2:分层显式Mock
逐层定义每一层方法的返回值,逻辑更清晰可控,适合所有场景:
// 先Mock第一层方法的返回值对象 Method1ReturnClazz method1ReturnMock = Mockito.mock(Method1ReturnClazz.class); when(mockedClass.method1()).thenReturn(method1ReturnMock); // 再定义第二层方法的返回值 when(method1ReturnMock.method2()).thenReturn(x);如果要配合
doReturn使用(比如针对Spy对象、有返回值的void方法等场景),调整写法如下:Method1ReturnClazz method1ReturnMock = Mockito.mock(Method1ReturnClazz.class); doReturn(method1ReturnMock).when(mockedClass).method1(); doReturn(x).when(method1ReturnMock).method2();
内容的提问来源于stack exchange,提问作者Tanaya Mitra
相关产品推荐
相关产品推荐

