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
相关产品推荐
相关产品推荐

