Тест входа не работает с ArgumentCaptor - PullRequest
0 голосов
/ 10 мая 2019

Я борюсь с ArgumentCaptor уже неделю, и не могу найти какой-либо ресурс или что происходит.

Просто я хочу проверить, может ли пользователь войти в мое приложение, я делаю это, просто вызывая метод презентатора signInWithEmailAndPassword(email,password), а затем проверяю, выполняется ли обратный вызов интерактора, чтобы убедиться, что он успешно вошел в систему, но каждый раз Я запускаю тест, я получаю это

java.lang.IllegalStateException: callbackCaptor.capture() must not be null

Presenter

override fun signInWithEmailAndPassword(email: String, password: String) {
    view?.showProgress()
    signInInteractor.signInWithEmailAndPassword(email, password, object : SignInInteractor.SignInCallBack {

        override fun onSuccess() {
            if (isViewAttached()) {
                view?.navigateToMain()
            }
        }

        override fun onFailure(errormsg: String) {
            if (isViewAttached()) {
                view?.hideProgress()
                view?.showError(errormsg)
            }
        }
    })
}

PresenterTest

@Captor
private lateinit var callbackCaptor: ArgumentCaptor<SignInInteractor.SignInCallBack>

@Mock
lateinit var view: LoginContract.View

@Mock
lateinit var interactor:SignInInteractor

@InjectMocks
lateinit var presenter: LoginPresenter

@Before
fun setUp() {
    MockitoAnnotations.initMocks(this)
    presenter.attachView(view)
}

@Test
fun shouldLoginIn(){
    presenter.signInWithEmailAndPassword("test4@gmail.com","asdasd")
    verify(interactor,times(1)).signInWithEmailAndPassword("test4@gmail.com","asdasd",callbackCaptor.capture())
    callbackCaptor.value.onSuccess()
    verify(view,times(1)).navigateToMain()
}

SignInCallback

interface SignInInteractor {

    interface SignInCallBack {
        fun onSuccess()
        fun onFailure(errormsg:String)
    }

    fun signInWithEmailAndPassword(email:String,password:String,listener:SignInCallBack)
}

И мой

Interactor

override fun signInWithEmailAndPassword(email:String, password:String, listener: SignInInteractor.SignInCallBack) {
    FirebaseAuth.getInstance()?.signInWithEmailAndPassword(email, password)
        ?.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                listener.onSuccess()
            } else { 
                listener.onFailure(it.exception.message)
            }
        }
}

Проблема в моем тесте, не позволяет мне проверить, если параметры, которые я выполнил, метод signInWithEmailAndPassword(...) возвращает onSuccess ()

Test Error

Ошибка в этой строке

verify(interactor,times(1)).signInWithEmailAndPassword("test4@gmail.com","asdasd",callbackCaptor.capture())

PD: Я уже установил ArgumentCaptor с ненулевым значением, но он также не работает

1 Ответ

1 голос
/ 10 мая 2019

Вы должны рассмотреть возможность использования mockito-kotlin для написания тестов в Kotlin .

callbackCaptor.capture() обрабатывает захват внутри иможет просто вернуть null.Похоже, что это также имеет место и здесь, в то время как вам на самом деле требуется ненулевой тип.Чтобы обойти это, вы можете использовать capture(ArgumentCaptor<T>) функцию mockito-kotlin , которая не возвращает null:

verify(interactor,times(1)).signInWithEmailAndPassword(
    "test4@gmail.com",
    "asdasd",
    capture(callbackCaptor)
)
...