收到错误 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.
如有不妥请大家评论指正,我会更新的
我正在编写单元测试。下面是我的代码。该架构是使用 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.
如有不妥请大家评论指正,我会更新的