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

