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

