You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito模拟JUnit测试异常:getRoom方法预期结果不符

问题原因及解决方法

你的测试失败核心原因是错误地使用了Mockito Mock对象而非Spy:

  • 当你用Mockito.mock(BookingManager.class)创建Mock对象时,Mockito会生成一个完全模拟的类实例,所有方法默认返回对应类型的默认值(boolean类型默认返回false)。
  • 你虽然Stub了getRoomsFromDb()方法,但Mock对象的getRoom()方法并不会执行真实类里的逻辑(即不会调用你Stub好的getRoomsFromDb()),而是直接返回Mock的默认值false,这就是测试失败的原因。

解决方案一:使用Spy(推荐)

Spy会包装真实的BookingManager对象,默认执行真实方法逻辑,同时允许你Stub特定方法(比如这里的getRoomsFromDb(),避免真实的数据库调用)。修改测试类的init方法即可:

@BeforeEach
void init() {
    // 创建Spy对象,基于真实的BookingManager实例
    this.bm = Mockito.spy(new BookingManager());
    List<Integer> rooms = new ArrayList<>();
    rooms.add(1);
    rooms.add(2);
    // Stub getRoomsFromDb方法,替换其返回值
    Mockito.when(this.bm.getRoomsFromDb()).thenReturn(rooms);
}

这样修改后,getRoom()会执行真实的逻辑,调用你Stub好的getRoomsFromDb(),从而返回正确的结果。


解决方案二:显式Stub getRoom方法(不推荐,适合仅需Mock场景)

如果你一定要用Mock对象,需要显式StubgetRoom()方法的返回值,对应测试用例的预期结果:

@BeforeEach
void init() {
    this.bm = Mockito.mock(BookingManager.class);
    List<Integer> rooms = new ArrayList<>();
    rooms.add(1);
    rooms.add(2);
    Mockito.when(this.bm.getRoomsFromDb()).thenReturn(rooms);
    // 显式Stub getRoom的返回值
    Mockito.when(this.bm.getRoom(1)).thenReturn(true);
    Mockito.when(this.bm.getRoom(5)).thenReturn(false);
}

但这种方式相当于直接指定了getRoom()的返回结果,并没有真正测试getRoom()的逻辑,因此仅适合不需要验证业务逻辑、仅需Mock对象行为的场景。


内容的提问来源于stack exchange,提问作者DDStackoverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:52:23