Mockito 无法模拟/监视,因为: - 最后一堂课

Mockito cannot mock/spy because : - final class

提问人:BRDroid 提问时间:8/19/2021 更新时间:9/27/2022 访问量:25111

问:

我是视图模型中的一个简单的函数 getCreditReport,我正在尝试在其中制作一个 API 调用存储库层 我想在 viewmodel 中测试 getCreditReport 以检查是否调用了存储库,但出现以下错误

   org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class com.example.clearscore.data.DataRepository
Mockito cannot mock/spy because :
 - final class

我尝试过什么

MainActivityViewModel

class MainActivityViewModel @Inject constructor(
    //private val retroServiceInterface: RetroServiceInterface,
    private val dataRepository: DataRepository
) : ViewModel() {
    var creditReportLiveData: MutableLiveData<CreditReport>

    init {
        creditReportLiveData = MutableLiveData()
    }

    fun getCreditReportObserver(): MutableLiveData<CreditReport> {
        return creditReportLiveData
    }

    fun getCreditReport() {
        viewModelScope.launch(Dispatchers.IO) {
            try {
                val response = dataRepository.getCreditReport()
                creditReportLiveData.postValue(response)
                Log.d("data", response.toString())
            } catch (e: IOException) {
                Log.d("data", e.toString())
            }
        }
    }
}

数据存储库

class DataRepository @Inject constructor(
        private val retroServiceInterface: RetroServiceInterface
) {

    suspend fun getCreditReport(): CreditReport {
        return retroServiceInterface.getDataFromApi()
    }
}

单元测试

@RunWith(MockitoJUnitRunner::class)
class MainActivityViewModelTest {
    @Mock
    private lateinit var dataRepository: DataRepository

    @Mock
    private lateinit var mainActivityViewModel: MainActivityViewModel

    @Test
    fun getCreditReport() {
        runBlocking {
            mainActivityViewModel.getCreditReport()
            verify(dataRepository).getCreditReport()
        }
    }
}

依赖注入组件 - 如果这有帮助

@Singleton
@Component(modules = [RetroModule::class])
interface RetroComponent {

    fun inject(mainActivityViewModel: MainActivityViewModel)

    fun getMainactivityViewModel(): MainActivityViewModel
}

请指出我做错了什么

谢谢 R

Android 单元测试 Kotlin Mockito

评论

0赞 aSemy 8/19/2021
您使用的是哪些 Mockito 版本和依赖项?
0赞 BRDroid 8/19/2021
@aSemy依赖项是 testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' testImplementation “org.mockito:mockito-core:2.28.2” androidTestImplementation “org.mockito:mockito-core:2.28.2”
1赞 aSemy 8/19/2021
谢谢。你试过添加吗?stackoverflow.com/a/63233687/4161471您也可以研究一下,它改进了 Mockito 对 Kotlin 的支持 github.com/mockito/mockito-kotlinmockito-inlinemockito-kotlin
1赞 BRDroid 8/20/2021
您好,我添加了它,它起作用了,谢谢

答:

25赞 Aishwarya 9/20/2021 #1

请尝试添加此依赖项

testImplementation "org.mockito:mockito-inline:3.11.2"
0赞 Paula T 9/27/2022 #2

[添加以帮助偶然发现这个问题的未来人]

就我而言,类不需要是最终的,所以我只是从类声明中删除了。final

评论

0赞 jodoro 9/19/2023
该类可能在某个库中,我应该如何从中删除最终的翻转?