簡體   English   中英

獲取錯誤 MockKException: no answer found for: Observer(#8).onChanged Android

[英]Getting error MockKException: no answer found for: Observer(#8).onChanged Android

我正在寫一個單元測試。 下面是我的代碼。 架構是使用 Dagger2 的 MVVM。 我正在調用駐留在 LoginViewModel 中的登錄函數,它通知 getLoginState 函數。 我得到的錯誤是:

錯誤:

 io.mockk.MockKException: no answer found for: Observer(#8).onChanged(Success(data=))
    
        at io.mockk.impl.stub.MockKStub.defaultAnswer(MockKStub.kt:90)

登錄視圖模型類:

 fun logIn(phone: String, phoneCode: String) {
        loginState.value = Outcome.success("")
}

 fun getLoginState(): LiveData<Outcome<String>> = loginState
 

LoginViewModelTest 類:

 @RelaxedMockK
    var SUT: LoginViewModel? = null

    @Mock
    var loginInteractor: LoginInteractor? = null

    @Mock
    var textValidator: TextValidator? = null

    @Mock
    var textProvider: TextProvider? = null

    @Mock
    var blinkUserPreferences: BlinkUserPreferences? = null

    @get:Rule
    var rule: TestRule = InstantTaskExecutorRule()

    @RelaxedMockK
    var mockObserver: Observer<Outcome<String>>? = null
    @Before
        fun setUp() {
    
            MockKAnnotations.init(this, relaxUnitFun = true)
             SUT = spyk(
                 LoginViewModel(
                         mockk<LoginInteractor>(),
                         mockk<TextValidator>(relaxed = true),
                         mockk<TextProvider>(),
                         mockk<BlinkUserPreferences>()))
            mockObserver = mockk<Observer<Outcome<String>>>()
             SUT!!.getLoginState().observeForever(mockObserver!!)
    
        }
     @Test
        fun logIn() {
            //Arrange 
            every {SUT!!.getLoginState().value} returns Outcome.success("")
    
            //Act 
            SUT!!.logIn("89989676","89998")

        //Assert  
        verify() { mockObserver!!.onChanged(Outcome.success("abc")) } 
    }

問題:在驗證中,為什么沒有調用 onChanged 方法,或者沒有找到 Observer().onChanged 的​​答案是什么意思,我如何通知我的 onChanged 方法以便我可以驗證它?

看完后: https : //mockk.io/#answers 它說

指定匹配的呼叫應答具有應答范圍的代碼塊

我剛剛發布了這個:

every { mockObserver!!.onChanged(any()) } answers {}

在下面的測試功能中,它起作用了。

@Test
 fun logIn() {
            //Arrange 
            every { mockObserver!!.onChanged(any()) } answers {}
            every {SUT!!.getLoginState().value} returns Outcome.success("abc")
    
            //Act 
            SUT!!.logIn("89989676","89998")

            //Assert  
            verify() { mockObserver!!.onChanged(Outcome.success("abc")) } 
    }

根據我的理解,如果你mockk一個函數,並且你想使用它的特定函數,你必須使用every表達式來告訴框架它會answer ,因為框架需要知道它需要回答一些事情

而且,如果您希望所有行為函數也應該與它們的實現一起添加模擬,那么您必須spyk您的類,以便它也獲得行為,然后您可以輕松地使用該函數,而無需使用表達式every

請注意, every表達式都用於許多情況,例如從該函數中獲得模擬結果,或者只需要告訴框架該函數應該answers這個問題。

如果我錯了,請通過評論糾正我,我會更新它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM