收到错误MockKException:找不到以下问题的答案: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
 

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类,以便它也获得行为,然后您可以轻松使用该功能而无需使用表达式{ {1}}。

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

如果我写错了,请通过评论纠正我,我会对其进行更新。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...