Android 代码在真实设备中成功运行,但需要mockito,但未调用

Android 代码在真实设备中成功运行,但需要mockito,但未调用,android,kotlin,mockito,mockito-kotlin,Android,Kotlin,Mockito,Mockito Kotlin,我被通缉,但没有被调用。我不知道该怎么办,因为我是新来的:)。顺便说一下,当我在真实设备上运行代码时,它是可以的 需要但未调用:observer.onChanged(true) 测试类 @RunWith(MockitoJUnitRunner::class) class LoginViewModelTest { var loginViewModel: LoginViewModel? = null @get:Rule val instan

我被通缉,但没有被调用。我不知道该怎么办,因为我是新来的:)。顺便说一下,当我在真实设备上运行代码时,它是可以的

需要但未调用:observer.onChanged(true)

测试类

 @RunWith(MockitoJUnitRunner::class)
    class LoginViewModelTest {

         var loginViewModel: LoginViewModel? = null
        @get:Rule
        val instantTaskExecutorRule = InstantTaskExecutorRule()
        @Mock
        lateinit var observer: Observer<Boolean>
        @Mock
        lateinit var dataManager: DataManager

        @Before
        fun setup() {
            MockitoAnnotations.initMocks(this)
            loginViewModel = LoginViewModel(dataManager)
        }

        @Test
        fun testApiFetchDataSuccess() {
            loginViewModel?.liveData?.observeForever(observer)
            loginViewModel?.login("test", "1234")
            verify(observer)?.onChanged(true)
        }

    }
@RunWith(MockitoJUnitRunner::class)
类LoginViewModelTest{
var loginViewModel:loginViewModel?=null
@获取:规则
val instantTaskExecutorRule=instantTaskExecutorRule()
@嘲弄
lateinit var观察者:观察者
@嘲弄
lateinit var数据管理器:数据管理器
@以前
趣味设置(){
initMocks(this)
loginViewModel=loginViewModel(数据管理器)
}
@试验
有趣的testapfetchdatasuccess(){
loginViewModel?.liveData?.ObserveForver(观察者)
loginViewModel?.login(“测试”,“1234”)
验证(观察者)?.onChanged(真)
}
}
ViewModelClass

class LoginViewModel(dataManager: DataManager?) : BaseViewModel() {

    var liveData: MutableLiveData<Boolean>
    var dataManager: DataManager? = dataManager

    init {
        liveData = MutableLiveData()
    }

    fun login(email: String, password: String) {
        dataManager?.getFireStoreManager()?.login(email, password)?.get()?.addOnSuccessListener {
            if (it.documents.size > 0) {
                val data = it.documents[0].toObject(User::class.java)
                liveData.postValue(true)
            } else {
                liveData.postValue(false)
            }
        }?.addOnFailureListener {
            liveData.postValue(false)
        }
    }
}
classloginviewmodel(dataManager:dataManager?):BaseViewModel(){
var-liveData:MutableLiveData
var数据管理器:数据管理器?=数据管理器
初始化{
liveData=MutableLiveData()
}
有趣的登录(电子邮件:String,密码:String){
dataManager?.getFireStoreManager()?.login(电子邮件、密码)?.get()?.addOnSuccessListener{
如果(it.documents.size>0){
val data=it.documents[0].toObject(用户::class.java)
liveData.postValue(true)
}否则{
liveData.postValue(false)
}
}?addOnFailureListener{
liveData.postValue(false)
}
}
}
get()
不会返回任何内容,因为您模拟了包含所有数据的
dataManager

在我的例子中,它看起来是这样的:

`when`(collectionRef.document(ArgumentMatchers.anyString())).thenReturn(documentReference)
`when`(documentReference.get()).thenReturn(firestoreDocumentResult)

您只需要为dataManager将触发的每个方法返回mock。

Firebase操作通常是异步的。您不应该只是模仿dataManager,而是指示它在被要求返回时返回什么
getFireStoreManager()
。模拟FireStoreManager,然后从登录中模拟任务。希望这对你有帮助。我猜,
addOnSuccessListener
从未被调用,您可以在那里设置断点。@giorgosnokleus您能写一个示例代码吗