Mockito verify抛出UnfinishedVerificationException问题求助
解决Mockito的UnfinishedVerificationException问题
你碰到的这个UnfinishedVerificationException是Mockito里很常见的问题,我帮你梳理下最可能的原因和解决办法:
最常见的原因:Mock对象未正确初始化
你用了@Mock注解来创建listMultipleChoiceMock,但如果没让Mockito处理这个注解,这个mock对象其实只是个普通的null或者未被代理的实例,调用verify()自然会报错。
解决办法分场景:
- JUnit 4环境:在测试类顶部加上
@RunWith(MockitoJUnitRunner.class)注解,让Mockito接管测试类的初始化流程。 - JUnit 5环境:换成
@ExtendWith(MockitoExtension.class)注解。 - 手动初始化:如果不想用注解驱动,也可以在测试前置方法里手动调用
MockitoAnnotations.openMocks(this);——比如JUnit 4的@Before或者JUnit 5的@BeforeEach方法中执行这行代码。
检查verify调用的语法细节
你的verify写法本身没问题,但可以再确认几点:
- 确保方法签名完全匹配:比如
setRequired(true)的参数类型是否和实际方法一致(比如方法是否接受boolean类型),有没有拼写错误的方法名。 - 第三个verify里用了
any(IModel.class),要确认已经静态导入了Mockito的any方法(import static org.mockito.Mockito.any;),如果没导入,需要写成Mockito.any(IModel.class)才会生效。
正确的示例代码
比如JUnit 5的完整测试类示例:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.any; @ExtendWith(MockitoExtension.class) public class YourTestClass { @Mock private ListMultipleChoice<String> listMultipleChoiceMock; @Test public void testMethod() { // 先执行被测试的代码,触发mock对象的三个方法调用 // 例如:yourService.configureList(listMultipleChoiceMock); // 验证方法调用 verify(listMultipleChoiceMock).setRequired(true); verify(listMultipleChoiceMock).setMaxRows(2); verify(listMultipleChoiceMock).setDefaultModel(any(IModel.class)); } }
其他可能的排查点
如果上面的方法都没用,再检查:
- 有没有在verify之前调用过
reset(listMultipleChoiceMock),重置了mock对象的调用记录。 - 有没有混用其他测试框架(比如PowerMock),可能和Mockito的初始化逻辑冲突,需要调整框架配置。
内容的提问来源于stack exchange,提问作者Robert van der Spek
相关产品推荐
相关产品推荐

