JUnit5迁移后verifyZeroInteractions报NotAMockException问题求助
以下是几种可能导致该问题的原因及对应解决方法:
Mockito与JUnit5兼容性不匹配
迁移到JUnit5后,需使用适配JUnit5的Mockito版本(Mockito 3.0及以上),旧版本Mockito无法正确适配JUnit5的测试上下文,导致Mock对象无法被验证方法识别。
解决:更新依赖,引入mockito-junit-jupiter(替代旧的mockito-core配合JUnit4的依赖),确保版本适配。Mock变量作用域或遮蔽问题
检查mockObject的声明:如果它是setup方法的局部变量,而非测试类的成员变量,那么测试方法中引用的mockObject可能是未初始化的类成员变量(存在同名变量时会发生遮蔽),自然不是Mock对象。
解决:将mockObject声明为测试类的成员变量,在setup方法中正确赋值给该成员变量。verifyZeroInteractions导入错误
若导入的verifyZeroInteractions并非来自org.mockito.Mockito(比如误导入PowerMock或其他测试库的同名方法),这些方法无法识别Mockito创建的Mock对象,从而抛出异常。
解决:确认导入语句为import static org.mockito.Mockito.verifyZeroInteractions;。未启用MockitoExtension
JUnit5中需要通过@ExtendWith(MockitoExtension.class)启用Mockito的上下文支持,否则Mockito的Mock对象无法被验证方法正确识别。
解决:在测试类上添加@ExtendWith(MockitoExtension.class)注解,或使用@Mock注解配合该Extension简化Mock对象的创建(推荐此方式,减少手动初始化出错概率)。
修正后的示例代码
import org.junit.jupiter.api.BeforeEach; 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.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.verifyZeroInteractions; @ExtendWith(MockitoExtension.class) public class MyControllerTest { @Mock private MyObject mockObject; private MyController controller; @BeforeEach public void setup() { controller = new MyController(mockObject); } @Test public void myTest() { // 确保searchRequest已正确初始化 SearchRequest searchRequest = new SearchRequest(); assertThrows(RuntimeException.class, () -> controller.search(searchRequest)); verifyZeroInteractions(mockObject); } }
内容的提问来源于stack exchange,提问作者user1474111

