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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:42:17