提问人:BRDroid 提问时间:8/19/2021 更新时间:9/27/2022 访问量:25111
Mockito 无法模拟/监视,因为: - 最后一堂课
Mockito cannot mock/spy because : - final class
问:
我是视图模型中的一个简单的函数 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
答:
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
该类可能在某个库中,我应该如何从中删除最终的翻转?
评论
mockito-inline
mockito-kotlin