【问题标题】:Code is running succesfully in real device but mockito wanted but not invoked代码在真实设备中成功运行,但 mockito 想要但未调用
【发布时间】: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


【解决方案1】:

get() 不返回任何内容,因为您模拟了包含所有数据的 dataManager

就我而言,它看起来像这样:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多