gpt4 book ai didi

android - 获取错误 MockKException : no answer found for: Observer(#8). onChanged Android

转载 作者:行者123 更新时间:2023-12-05 00:15:56 27 4
gpt4 key购买 nike

我正在编写单元测试。下面是我的代码。该架构是使用 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)

登录 View 模型类:

 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 .它说

specify that the matched call answers with a code block scoped withanswer 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你的类,这样它也能获得行为,然后你就可以轻松地使用这个函数而不用使用表达式 every.

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

如有不妥请大家指正,我会及时更新

关于android - 获取错误 MockKException : no answer found for: Observer(#8). onChanged Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63775513/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com