使用MockK模拟Hibernate createQuery返回Query报类型不匹配解决方法
错误原因
编译报错是MockK的returns语法使用错误:
returns后直接跟值时,代表Mock方法固定返回该值returns后跟大括号包裹的lambda时,代表Mock方法被调用时执行lambda逻辑、动态返回结果
你的代码里给returns后套了多余的大括号,实际传入的是() -> Query类型的函数对象,和createQuery方法要求的Query返回值类型不匹配,才触发类型错误。同样get方法的returns { null }也是错误写法。
正确写法
去掉returns后多余的大括号,直接传入要返回的实例即可,参考代码:
// 模拟Query对象,如果后续需要调用Query的executeUpdate、getResultList等方法,提前补全对应模拟规则 val mockedQuery = mockk<Query<Any>> { every { executeUpdate() } returns 0 // 示例:模拟删除SQL执行后影响0行,可根据业务调整返回值 } val mockSessionFactory = mockk<SessionFactory> { every { openSession() } returns mockk { every { get(any(), any()) } returns null every { createQuery("delete from SaveableObject where expiration < getdate() ") } returns mockedQuery } }
可选优化
- 如果不想逐个模拟Query的所有方法,可以在Mock时开启
relaxed = true,对没有显式模拟的方法返回默认值,避免运行时抛异常:val mockedQuery = mockk<Query<Any>>(relaxed = true) - 如果你用的旧版Hibernate返回raw类型的Query,把泛型声明改成
Query<*>即可适配类型。
内容的提问来源于stack exchange,提问作者XenoPuTtSs
相关产品推荐
相关产品推荐

