You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mockito verify方法时遭遇NotAMockException的原因排查

Mockito verify()抛出NotAMockException的原因

问题代码

CarService类

public class CarService {

    private final VinService vinService;

    public void checkCar(String VIN) {
        // 此处为业务逻辑:创建列表、传入VIN、添加Consumer等
        vinService.checkVin(list, VIN, consumer); // VinService的checkVin方法为void类型
    }
}

测试类

@ExtendWith(MockitoExtension.class)
public class CarServiceTest {

    private static final String VIN = "1G100000000000000" // 缺少分号

    @Mock
    private CarService carService; // 错误地Mock了待测试的类

    @Mock
    private VinService vinService;

    @Test
    void vinShouldBeCheckedSuccessfully() {
        // when
        carService.checkCar(VIN);

        // then
        Mockito.verify(vinService, Mockito.times(1)).checkVIN( // 方法名大小写不匹配
                Mockito.anyList(),
                Mockito.anyString(),
                Mockito.any()); // Consumer参数
    }
}

错误信息

org.mockito.exceptions.misusing.NotAMockException: 
    Argument passed to verify() is of type VinService and is not a mock!
    Make sure you place the parenthesis correctly!
    See the examples of correct verifications:
        verify(mock).someMethod();
        verify(mock, times(10)).someMethod();
        verify(mock, atLeastOnce()).someMethod();

异常产生的原因

  1. 待测试类被错误Mock:你需要测试CarService的真实业务逻辑,但代码中给CarService加了@Mock注解,调用Mock对象的checkCar()不会执行真实代码,自然不会触发vinService.checkVin()的调用。
  2. Mock实例未关联:即使Mock了VinService,这个实例也没有注入到CarService中,两者没有关联关系。
  3. 语法错误导致Mock初始化失败:测试类中VIN常量定义末尾缺少分号,编译错误会导致Mockito的@Mock注解无法正常初始化VinService实例,使得传入verify()的不是Mock对象。
  4. 方法名大小写不匹配:CarService中调用的是checkVin()(小写vin),但测试中verify()里写的是checkVIN()(大写VIN),方法名不匹配会触发Mockito异常。

修正示例

@ExtendWith(MockitoExtension.class)
public class CarServiceTest {

    private static final String VIN = "1G100000000000000"; // 修复分号

    @InjectMocks // 自动将Mock的VinService注入真实的CarService实例
    private CarService carService;

    @Mock
    private VinService vinService;

    @Test
    void vinShouldBeCheckedSuccessfully() {
        // when
        carService.checkCar(VIN);

        // then
        Mockito.verify(vinService, Mockito.times(1)).checkVin( // 修正方法名
                Mockito.anyList(),
                Mockito.eq(VIN), // 用eq()匹配具体VIN值,测试更精准
                Mockito.any(Consumer.class)); // 指定Consumer类型,避免模糊匹配
    }
}

内容的提问来源于stack exchange,提问作者TheFastestTurtle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:10:38