【问题标题】:Mockito cannot mock/spy because : - final classMockito 无法模拟/监视,因为:-final class
【发布时间】: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-inlinestackoverflow.com/a/63233687/4161471 你也可以查看 mockito-kotlin,它改进了 Mockito 对 Kotlin 的支持 github.com/mockito/mockito-kotlin
  • 你好,我添加了,它工作了,谢谢

标签: android unit-testing kotlin mockito


【解决方案1】:

请尝试添加此依赖项

testImplementation "org.mockito:mockito-inline:3.11.2"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多