如何解决收到错误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
。
如果我写错了,请通过评论纠正我,我会对其进行更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。