【发布时间】:2019-09-20 07:52:36
【问题描述】:
我得到了 mockito 想要但没有被调用。我不知道该怎么做,因为我是新来的:)。顺便说一句,当我在真实设备上运行代码时,它还可以。
需要但未调用: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)
}
}
视图模型类
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)
}
}
}
【问题讨论】:
-
Firebase 操作通常是异步的。您不应该只是模拟您的 dataManager,而是指示它在被要求返回
getFireStoreManager()时返回什么。也模拟一个 FireStoreManager,然后从登录中模拟任务。希望这对您有所帮助。我猜addOnSuccessListener永远不会被调用,你可以在那里放一个断点。 -
@GiorgosNeokleous 你能写一个示例代码吗 :)
标签: android kotlin mockito mockito-kotlin