收到错误 MockKException:找不到答案: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)

LoginViewModelClass:

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

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

LoginViewModelTestclass:

 @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。它说

specify that the matched call answers with a code block scoped with answer scope

我刚刚发布了这个:

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 您的 class 以便它也获得行为,然后您可以轻松使用不使用表达式 every.

的函数

请注意 every 表达式用于许多情况,例如从该函数中获取模拟结果,或者只需要告诉框架该函数应该 answers this.

如有不妥请大家评论指正,我会更新的