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

Mockito模拟对象存根方法未生效,测试未抛出预期异常

问题原因

你用mock(UserManager.class)创建的是完全模拟的对象,Mockito会给这个对象的所有方法生成默认空实现——调用addUser时,执行的不是你写的真实addUser逻辑,而是Mockito的空方法,根本不会去调用checkUsername,所以你给checkUsername做的存根完全不会生效,自然不会抛出异常。

解决方案

使用Spy而非Mock,Spy可以保留对象的真实方法逻辑,同时允许你存根特定方法来模拟场景:

修改后的测试代码:

@Test
public void AddExistingUser(){
    // 使用Spy包装真实的UserManager实例
    mockedManager = spy(new UserManager());

    // 存根checkUsername方法,指定参数时返回true
    // 注意用doReturn语法,避免先执行真实的checkUsername方法
    doReturn(true).when(mockedManager).checkUsername("test");
    
    assertThrows(IllegalArgumentException.class, () -> {
        mockedManager.addUser("test", "test");
    });
}
补充说明
  • Spy的作用是部分模拟:默认会调用对象的真实方法,只有被你存根的方法才会返回预设值。
  • 为什么用doReturn而不是when(mockedManager.checkUsername("test")).thenReturn(true)?
    因为后者会先执行一次真实的checkUsername("test"),可能会因为usersData为空返回false,干扰存根效果;doReturn则直接跳过真实方法执行,直接返回预设值,更符合测试需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:35:03