Mockito模拟memberDao.findNext()返回NULL问题及void方法测试咨询
先来说第一个问题:为什么memberDao.findNext()总是返回null?
这里大概率是你的mock对象没有正确关联到主类,或者mock初始化环节出了问题,我列几个最常见的排查点:
检查Mock对象是否正确初始化
如果你用JUnit 4,要确保测试类上标注@RunWith(MockitoJUnitRunner.class),或者在@Before方法里调用MockitoAnnotations.openMocks(this);如果是JUnit 5,记得加@ExtendWith(MockitoExtension.class)。要是没做这些,你标注的@Mock MemberDao memberDao其实是个空对象,stub设置自然不会生效。确认主类使用的是Mock对象
主类里的memberDao不能是自己new出来的实例,得通过依赖注入的方式把mock对象传进去。举个例子:// 主类 public class MemberService { private final MemberDao memberDao; // 构造器注入依赖 public MemberService(MemberDao memberDao) { this.memberDao = memberDao; } public String createNewId() { Id id = memberDao.findNext(); // ... 其他业务逻辑 memberDao.delete(id.getId()); return id.getId(); } } // 测试类 @Mock private MemberDao memberDao; private MemberService memberService; @BeforeEach // JUnit5用这个,JUnit4用@Before void setUp() { // 把mock对象注入到主类实例中 memberService = new MemberService(memberDao); }如果主类里还是硬编码
private MemberDao memberDao = new MemberDaoImpl();,那你的mock完全没被用到,调用的是真实DAO的方法,自然返回null。排查方法重载问题
有没有可能MemberDao里有多个findNext()方法?比如一个无参、一个带参数?如果你的stub是针对无参方法,但主类实际调用的是带参重载,那也会返回null。这种情况要确保stub的方法签名和主类调用的完全一致。
接下来是第二个问题:如何测试memberDao.delete(newId.getId());这个void方法?
Mockito测试void方法的核心是验证方法是否被正确调用,具体步骤如下:
先完成findNext()的stub设置
先确保findNext()能返回你预期的对象,比如:Id mockId = new Id("USER_123"); // 假设Id是你的实体类 when(memberDao.findNext()).thenReturn(mockId);调用主类的业务方法
触发主类中调用delete方法的逻辑:String generatedId = memberService.createNewId();用verify()验证delete方法的调用行为
检查delete方法是否被调用了预期次数,并且参数符合预期:// 验证delete被调用1次,参数是mockId的id值 verify(memberDao, times(1)).delete("USER_123"); // 或者用eq()明确参数匹配,可读性更强 verify(memberDao).delete(eq(mockId.getId()));如果你要验证方法从未被调用,可以用
verify(memberDao, never()).delete(anyString());
另外,如果你的delete方法需要模拟抛出异常的场景,还可以用doThrow():
// 模拟delete方法抛出异常 doThrow(new RuntimeException("删除失败")).when(memberDao).delete("USER_123"); // 调用方法后验证异常是否抛出 assertThrows(RuntimeException.class, () -> memberService.createNewId());
最后总结一下:先把mock对象的初始化和注入问题解决,搞定findNext()返回null的问题,再用verify()来验证void方法的调用行为即可。
内容的提问来源于stack exchange,提问作者Rahul

