使用Mockito的测试用例未返回预期字符串,listCats方法问题排查
问题根因分析
1. 初始版本返回空字符串
你未对Mock的Cat对象的getRented()方法做打桩配置:
- 若
getRented()返回的是Boolean包装类型,Mockito对未打桩的引用类型方法默认返回null,此时执行c.getRented() == false判断时条件不成立,不会进入拼接逻辑,最终返回空字符串。 - 若
getRented()返回的是基本类型boolean,Mockito默认返回false,此时需要额外排查addCat方法是否正常、cats集合是否成功存入了传入的c1/c2/c3对象。
2. 修改后仅返回单只猫信息
你把return retBuild.toString();语句写在了for循环的if分支内部,第一次匹配到符合条件的Cat对象并完成拼接后,方法就会直接返回结果,循环终止,只能拿到第一条匹配的猫的信息。
3. 返回值为Mock for Cat, hashCode: 10523xyz
你调用c.toString()拼接字符串,但未对Mock的Cat对象的toString()方法打桩,Mockito生成的Mock对象默认的toString()实现只会输出类名和哈希值,不会自动生成你期望的ID x. 名字格式内容。
修复方案
- 给所有Mock的
Cat对象补充getRented()方法打桩,示例:
Mockito.when(c1.getRented()).thenReturn(false); Mockito.when(c2.getRented()).thenReturn(false);
- 将
return语句移到for循环外部,等所有符合条件的猫都拼接完成后再返回结果。 - 调整拼接逻辑,直接使用已经打桩的
getId()和getName()方法拼接,无需依赖toString():
public String listCats() { StringBuilder retBuild = new StringBuilder(); for(Cat c : cats) { if(Boolean.FALSE.equals(c.getRented())) { // 该写法可避免包装类空指针 retBuild.append("ID ").append(c.getId()).append(". ").append(c.getName()); retBuild.append("\n"); } } // 可根据需求trim掉末尾多余的换行 return retBuild.toString().trim(); }
- 修正测试断言里的多余转义引号,你当前写的期望字符串末尾多了一个
\",会导致断言匹配失败。
内容的提问来源于stack exchange,提问作者CodeThisAndThat
相关产品推荐
相关产品推荐

