[英]Android Kotlin Unit test failing with io.mockk.MockKException: no answer found for
[英]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.