【发布时间】:2021-08-18 23:57:22
【问题描述】:
我是 viewmodel 中的一个简单函数 getCreditReport,我试图在其中创建一个 API 调用存储库层 我想在 viewmodel 中测试 getCreditReport 以检查是否调用了 thge 存储库,但出现以下错误
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
}
请指出我做错了什么
谢谢 回复
【问题讨论】:
-
您使用的是哪些 Mockito 版本和依赖项?
-
@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"
-
谢谢。您是否尝试过添加
mockito-inline? stackoverflow.com/a/63233687/4161471 你也可以查看mockito-kotlin,它改进了 Mockito 对 Kotlin 的支持 github.com/mockito/mockito-kotlin -
你好,我添加了,它工作了,谢谢
标签: android unit-testing kotlin mockito