gpt4 book ai didi

android - Mockito 想要但未调用 - 但是,与此模拟正好有 1 次交互

转载 作者:太空狗 更新时间:2023-10-29 13:46:41 24 4
gpt4 key购买 nike

这是我第一次使用mockito & roboelectric 在android studio 上做单元测试。
我想验证 view.onSuccessLogin() 在对服务器/API 的请求成功时被调用。但是,我得到一个错误“需要但未调用 - 但是,与此模拟只有 1 次交互”

这是我的演示类:

class PresenterLogin internal constructor(private val view: View) {

private val compositeDisposable = CompositeDisposable()

interface View : BaseView {
fun onSuccessLogin()
}

fun requestLogin(username: String, password: String) {
view.showProgressDialog()
val disposable = ApiHelper.service.requestSignIn(ApiHeaders().headers,
username, password, AppPreference.getInstance().firebaseToken)
.map { response -> return@map response.toString() }
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(
{ response ->
view.hideProgressDialog()
view.onSuccessLogin()
},
{ error ->
view.hideProgressDialog()
view.showError(error.message)
}
)
compositeDisposable.add(disposable)
}

fun onViewDestroyed() {
compositeDisposable.dispose()
}
}

这是我的 PresenterLoginTest 类

@RunWith(RobolectricTestRunner::class)
@Config(constants = BuildConfig::class)
class PresenterLoginTest {

private lateinit var activity: ActivityLogin

@Mock
lateinit var view: PresenterLogin.View
@Mock
lateinit var service: ApiService
@Mock
lateinit var callLogin: Observable<Login>

private lateinit var presenter: PresenterLogin

@Before
fun setUp() {
activity = Robolectric.buildActivity(ActivityLogin::class.java)
.create()
.resume()
.get()
MockitoAnnotations.initMocks(this)
presenter = PresenterLogin(view)
}

@Test
@Throws(Exception::class)
fun shouldNotBeNull() {
assertNotNull(activity) // Success
}

@Test
fun requestLogin() {
Mockito.`when`(service.requestSignIn(
ApiHeaders().headers, "081212345678", "12345", ""))
.thenReturn(Observable.just(Login()))
presenter.requestLogin("081212345678", "12345")
verify(view).showProgressDialog() // Success
verify(view).onSuccessLogin()
/*
Wanted but not invoked:
view.onSuccessLogin();
-> at package.PresenterLoginTest.requestLogin(PresenterLoginTest.kt:117)

However, there was exactly 1 interaction with this mock:
view.showProgressDialog();
*/
}
}

最佳答案

showProgressDialog 方法在 mocked 方法之前被调用,所以它通过了验证(这是与这个 mock 的 1 次交互),

如果你模拟方法 requestSignIn 然后它不会发送一个正常的请求产生一个 subscribe 将附加到的响应,因此它的嵌套方法 onSuccessLogin 不会被执行。

关于android - Mockito 想要但未调用 - 但是,与此模拟正好有 1 次交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52602139/

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