android - Mockito 无法模拟/监视,因为:-final class
问题描述
我是 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
}
请建议我做错了什么
谢谢R
解决方案
请尝试添加此依赖项
testImplementation "org.mockito:mockito-inline:3.11.2"
推荐阅读
- javascript - 每次用户点击每一行的添加银行时,应该从01号开始
- laravel - 从枢轴加载 Laravel 关系
- php - 只允许客户购买某种产品一次,即使他们没有登录
- ios - 交换按钮单击以使用 Swift 交换用户默认值并将值更新到 TableView UI
- c# - Unity - admobs 不显示,抛出错误
- r - system2 不会将 java 命令行的输出保存到文件系统,只在控制台中创建输出
- selenium-webdriver - 在 Selenium 中截屏时 System.getProperty() 有什么用?
- c - 使用 ulimit 命令更改堆栈的软限制
- android - 无法在 BottomSheetBehavior 内的 NestedScrollView 内滚动 RecyclerView
- csv - 响应 cURL 请求时使用什么内容配置?