Estoy tratando de ejecutar pruebas unitarias usando MockitoJUnitRunner; funcionan bien en Android Studio, pero algunas pruebas (no todas) fallan cuando se ejecutan en la línea de comandos, lo cual es un gran problema, necesito poder ejecutarlas desde mi plataforma de integración continua, no solo desde un IDE. Aquí está uno de los métodos reales que se están probando:
internal fun requestSecurityQuestion() { if (isViewAttached) mvpView.showLoadingDialog() api.getSecurityQuestionToday(mDataManager.token, ACTION_ASK_SECURITY_QUESTION_ON_LOGIN, 0) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : CallbackWrapper<SettingsResponse>(mDataManager) { override fun onSuccess(response: SettingsResponse) { mDataManager.securityQuestion = response.question mDataManager.processId = response.processId if (isViewAttached) { mvpView.dismissLoadingDialog() mvpView.showVsecVerificationDialog(0, response.question!!) } } override fun onFailed(errorId: Int, jsonResponse: String?) { if (isViewAttached) mvpView.dismissLoadingDialog() } }) }Aquí está una de las pruebas que fallan:
@RunWith(MockitoJUnitRunner::class) class HomePresenterTest { @Mock private var mView: HomeView? = null @Mock private var mDataManager: DataManager? = null @Mock private var mApi: Api? = null lateinit var mPresenter: HomePresenter @Before fun setUp() { mPresenter = spy(HomePresenter(mDataManager!!)) mPresenter.attachView(mView!!) } @Test fun requestSecurityQuestion_onSuccess() { val response = SettingsResponse() response.question = TestData.secretQuestion response.processId = TestData.processId `when`(mPresenter.api).thenReturn(mApi) `when`(mDataManager!!.token).thenReturn(TestData.userToken) `when`<Observable<SettingsResponse>>(mApi!!.getSecurityQuestionToday( TestData.userToken, ACTION_ASK_SECURITY_QUESTION_ON_LOGIN, 0)) .thenReturn(Observable.just(response)) mPresenter.requestSecurityQuestion() verify<HomeView>(mView).dismissLoadingDialog() verify<HomeView>(mView).showVsecVerificationDialog(0, TestData.secretQuestion) } } Y esto es lo que obtengo cuando ejecuto las pruebas en la línea de comando usando ./gradlew testDebugUnitTest
> Task :app:testDebugUnitTest com.domain.app.screens.main.home.HomePresenterTest > requestSecurityQuestion_onSuccess FAILED org.mockito.exceptions.verification.WantedButNotInvoked at HomePresenterTest.kt:306Además: estoy usando Android Studio 3.1.4, la versión de Gradle es 3.1.2, la versión de Mockito es 2.8.9
Tuve el mismo problema, pero con Java.
La razón para mí fue que traté de devolver un simulacro en un método que se llamó en un contexto estático, por lo que no me molestó mi llamada Mockito.when() . Aunque es una mala práctica hacerlo, moví la llamada al método fuera del contexto estático, porque no había necesidad de que fuera estático y funcionó.
Tal vez eso ayude.