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
相关产品推荐
相关产品推荐

