Java测试中canSlide方法返回true却断言为false的原因排查
问题原因与解决办法
核心原因
- Mock框架的默认规则:主流Mock框架(如Mockito)创建Mock对象时,会对所有可重写方法设置默认返回值——布尔类型默认返回
false,引用类型返回null,数值类型返回0。这个规则优先级远高于原类/抽象类中的方法实现。 - Mock对象的方法重写逻辑:当你用
mock(StrategySlide.class)创建抽象类的Mock实例时,框架会动态生成一个子类,并重写所有非final方法。这些重写后的方法完全忽略原抽象类中canSlide返回true的实现,直接使用框架默认返回值。
解决方式
方式一:显式指定Mock方法的返回值
以Mockito为例,手动设置canSlide方法的返回结果:
StrategySlide mockSlide = mock(StrategySlide.class); // 强制指定canSlide返回true when(mockSlide.canSlide()).thenReturn(true); assertTrue(mockSlide.canSlide()); // 断言成功
方式二:使用Spy保留原方法实现
如果你希望复用抽象类中已有的方法逻辑,可以用spy代替mock(抽象类需要先通过匿名内部类实例化):
// 创建抽象类的实例(匿名内部类),再包装为Spy对象 StrategySlide spySlide = spy(new StrategySlide() {}); assertTrue(spySlide.canSlide()); // 调用原抽象类的canSlide方法,返回true
内容的提问来源于stack exchange,提问作者StackUser
相关产品推荐
相关产品推荐

