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

Quarkus Kotlin中PanacheMock搭配Mockito.when测试报错问题咨询

解决Quarkus Kotlin中PanacheMock与Mockito配合的报错问题

问题诊断

你遇到的MissingMethodInvocationException核心原因是Kotlin的Companion Object与Java静态方法的Mock逻辑存在差异:

  • listAll()是定义在Anything的PanacheMongoCompanion实现类(即Companion Object)上的方法,而非Anything类本身
  • 你之前mock的目标是Anything::class.java,但实际需要mock的是它的Companion Object实例

解决方案

1. 修正Mock目标

将PanacheMock.mock的目标改为Companion Object的Class对象:Anything.Companion::class.java

2. 调整Mockito Stub语法

Kotlin中可直接通过Anything.listAll()调用Companion方法,无需显式写Companion

修正后的测试代码

@QuarkusTest
class AnythingResourceTest {

    @Test
    fun testFetchAllAnythings() {
        // 正确mock Companion Object
        PanacheMock.mock(Anything.Companion::class.java)

        val anything = Anything().apply {
            id = "id"
            type = "type"
        }

        // Kotlin直接调用Companion方法即可
        Mockito.`when`(Anything.listAll()).thenReturn(listOf(anything))
        
        // 可添加接口调用断言,示例:
        // given().get("/anythings").then().statusCode(200).body("size()", equalTo(1))
    }

    @AfterEach
    fun cleanup() {
        // 测试结束后取消mock,避免影响其他测试
        PanacheMock.unmockAll()
    }
}

关键说明

  • Quarkus的PanacheMock完全支持Kotlin,只需适配Kotlin的Companion Object特性
  • mockito-inline依赖是必须的,因为Kotlin默认类为final,它能让Mockito支持final类/方法的Mock
  • 测试完成后务必调用PanacheMock.unmockAll(),防止Mock状态污染其他测试用例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:58:57