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

Kotlin返回Unit的函数测试问题:Mockito模拟返回值时结果为null

解决Mockito模拟返回Unit类型函数时返回null的问题

问题根源

你测试代码的核心问题是:每次调用mock(MyRequest::class.java)都会生成全新的MyRequest mock实例。Mockito的存根匹配逻辑依赖对象相等性,设置存根时用的是第一个mock实例,而实际调用时传的是第二个完全不同的实例,导致存根不生效,最终返回默认的null。

解决方案

方案1:复用同一个MyRequest mock实例

提前创建唯一的mock实例,存根设置和实际调用都使用该对象:

@Test
fun myFunctionToTest_Success() = runBlocking {
    // 提前创建唯一的MyRequest mock实例
    val mockRequest = mock(MyRequest::class.java)
    
    // 用该实例配置存根
    Mockito.`when`(repository.myFunctionToTest(mockRequest))
        .thenReturn(ApiResultHandle.Success(Unit))

    // 调用时传入同一个实例
    val result = repository.myFunctionToTest(mockRequest)

    Truth.assertThat(result).isEqualTo(ApiResultHandle.Success(Unit))
}

方案2:使用参数匹配器匹配任意MyRequest实例

如果不需要关注具体的请求实例,用any()匹配器匹配任意类型的MyRequest参数(需导入Mockito的匹配器):

import org.mockito.ArgumentMatchers.any

@Test
fun myFunctionToTest_Success() = runBlocking {
    // 用any()匹配任意MyRequest实例
    Mockito.`when`(repository.myFunctionToTest(any(MyRequest::class.java)))
        .thenReturn(ApiResultHandle.Success(Unit))

    // 此处可传入任意MyRequest实例(包括新的mock)
    val result = repository.myFunctionToTest(mock(MyRequest::class.java))

    Truth.assertThat(result).isEqualTo(ApiResultHandle.Success(Unit))
}

额外建议:使用mockito-kotlin简化Kotlin测试

纯Mockito对Kotlin挂起函数、空安全的支持有限,推荐使用mockito-kotlin库,写法更简洁且适配Kotlin特性:

import io.mockk.every
import io.mockk.mockk

@Test
fun myFunctionToTest_Success() = runBlocking {
    val repository = mockk<YourRepositoryType>()
    val mockRequest = mockk<MyRequest>()
    
    every { repository.myFunctionToTest(mockRequest) } returns ApiResultHandle.Success(Unit)

    val result = repository.myFunctionToTest(mockRequest)

    Truth.assertThat(result).isEqualTo(ApiResultHandle.Success(Unit))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:05:03