android - 每当参数时 mockito-kotlin - 指定为非空的参数为空

标签 android kotlin mockito

为了测试,我为 ViewModelProviders.of(...).get(...) 写了一个包装器这样我就可以提供一个模拟:

class MyViewModelProvider {
    fun <T : ViewModel> get(scope: Fragment, type: Class<T>) : T {
        return ViewModelProviders.of(scope).get(type)
    }

    ...
}

然后在我的测试中:

Dagger 测试模块:

import com.nhaarman.mockito_kotlin.mock

...

fun provideMyViewModelProvider(): MyViewModelProvider {
        return mock()
}

在我的测试课上:

import com.nhaarman.mockito_kotlin.any
import com.nhaarman.mockito_kotlin.anyOrNull
import com.nhaarman.mockito_kotlin.whenever
...
@Inject
lateinit var mockViewModelProvider: MyViewModelProvider
...
val mockViewModel = mock<MyViewModel>()

whenever(mockViewModelProvider.get(any<Fragment>(), any<Class<ViewModel>>())).thenReturn(mockViewModel)
...

但是用whenever就行了我收到错误:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter scope

我尝试了一些事情:

  1. 交换 any<Fragment>(), any<Class<ViewModel>>())anyOrNull<Fragment>(), anyOrNull<Class<ViewModel>>() --> 还是报错

  2. 尝试使用具体引用 whenever(mockViewModelProvider.get(myFragment, MyViewModel::class.java)).thenReturn(mockViewModel) --> 调用实际方法而不是模拟

不确定我做错了什么......

最佳答案

找到答案:

mocked函数需要标记为open或者使用mock-maker-inline。

https://github.com/nhaarman/mockito-kotlin/wiki/Parameter-specified-as-non-null-is-null

关于android - 每当参数时 mockito-kotlin - 指定为非空的参数为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54047452/

相关文章:

java - 如何模拟 ObjectMapper 的 readValue 方法?

android - 如何使用数据绑定(bind)在 MVVM 中设置适配器

java - 是否有用于 mockito stub 的 `not` ArgumentMatcher

android - 无法在 AVD 中运行旧版 Android 目标

kotlin - 为什么记得不将 StateFlow 转换为特定类型?

Javadoc @link 到 Kotlin 类

android - 如何使用 LiveData 观察共享偏好的变化?

java - 在 Mockito mock 方法中将 JSONObject 作为参数

java - Android:将 arraylist<object> 转换为 arraylist<element> 的便捷方法?

java - 使用 viewpager 的 fragment 事务返回空白 View