JUnit测试中如何Mock父类方法super.getUserForUID的返回值?
如何Mock子类中调用的父类方法返回值
针对你遇到的问题,直接通过Spy对象mock父类方法时,若使用常规的when(...).thenReturn(...)会触发真实父类方法执行,正确的做法是使用Mockito的doReturn()语法来跳过真实调用,直接指定返回值:
具体步骤
- 先创建一个模拟的
User对象,用于指定返回值:
User mockUser = new User(); // 根据测试需求设置mockUser的属性,比如mockUser.setId("testId");
- 使用
doReturn()来mock父类的getUserForUID方法,避免触发真实逻辑:
doReturn(mockUser).when(customerUserService).getUserForUID(anyString());
这里的anyString()是Mockito的参数匹配器,可根据实际测试场景替换为具体的userId值。
- 调用待测试的
getUserForID方法,此时super.getUserForUID(userId)会返回你预先设置的mockUser,从而可以专注测试方法内后续的业务逻辑:
User result = customerUserService.getUserForID("testUserId"); // 对result进行断言验证
为什么之前的方式无效
当使用Spy对象时,when(spyObject.method()).thenReturn(...)的语法会先执行一次真实的方法调用,再将返回值替换为你指定的对象,这就是为什么父类的真实逻辑仍然会被执行。而doReturn().when(spyObject).method()则是直接指定返回值,不会触发任何真实方法的调用,完美适配你的测试场景。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

