Mockito хотел, но не вызывал - однако, с этим макетом было ровно 1 взаимодействие - PullRequest
0 голосов
/ 02 октября 2018

Это первый раз, когда я использую mockito & roboelectric для тестирования юнитов на андроид студии.Я хочу убедиться, что 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();
    */
}
}

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я решаю проблему, следуя этому репо: https://github.com/alfianyusufabdullah/RetrofitUnitTesting/tree/master/retrofit

Идея состоит в том, чтобы использовать RepositoryCallback, чтобы мы могли высмеивать ответ от API

0 голосов
/ 02 октября 2018

showProgressDialog метод вызывается перед смоделированным методом, поэтому он прошел проверку (это 1 взаимодействие с этим макетом),

Если вы смоделируете метод requestSignIn, то он не отправит обычный запрос, выдающийответ, к которому будет присоединен subscribe, и поэтому его вложенный метод onSuccessLogin не будет выполнен.

...