Модульное тестирование не удалось с kotlin IllegalStateException - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь убедиться, что когда я вызываю мой интерактор createUser в моем докладчике, пользователь создается в Firebase.

Для этого я просто реализовал этот контрольный пример

RegisterTest.class

    @Captor
    var callbackCaptor: ArgumentCaptor<RegisterInteractor.RegisterCallBack>? = null

    @Mock
    lateinit var view: RegisterContract.View

    @Mock
    lateinit var interactor: RegisterInteractor
    lateinit var presenter: RegisterPresenter


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

    @Test
        fun should_SignUpUser(){
            //give
            presenter.signUp("testUser","testEmail@gmail.com","123456")
            //when
            verify(interactor).createUserWithEmailAndPassword("testUser","testEmail@gmail.com","123456", callbackCaptor!!.capture())
            callbackCaptor?.value?.onRegistrationSucces()
            //then
            verify(view).navigateToMain()
        }

Регистрация Обратного звонка Интерактора

interface RegisterInteractor {

    interface RegisterCallBack {
        fun onRegistrationSucces()
        fun onRegistrationFailure(errorMsg:String)
    }

    fun createUserWithEmailAndPassword(fullName:String,email:String,password:String,listener:RegisterCallBack)
}

RegisterPresenter

Здесь я вызываю метод signUp для проверки

 override fun signUp(fullName:String, email: String, password: String) {
        view?.showProgress()
        registerInteractor?.createUserWithEmailAndPassword(fullName,email, password, object : RegisterInteractor.RegisterCallBack {

                override fun onRegistrationSucces() {
                    if(isViewAttached()){
                        view?.navigateToLogin()
                        view?.hideProgress()
                    }
                }

                override fun onRegistrationFailure(errorMsg:String) {
                    if(isViewAttached()){
                        view?.showError(errorMsg)
                        view?.hideProgress()
                    }
                }

            })
    }

RegisterInteractorImpl

  override fun createUserWithEmailAndPassword(fullName:String,email:String,password:String,listener: RegisterInteractor.RegisterCallBack){
        FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    // Sign in success, set full name and navigate to main.
                    val user = FirebaseAuth.getInstance().currentUser
                    val profileUpdates = UserProfileChangeRequest.Builder()
                        .setDisplayName(fullName)
                        .build()

                    // Checks if the user is already in the database, if not, it will write it and go to the main activity
                    user?.updateProfile(profileUpdates)
                        ?.addOnCompleteListener { updateTask ->
                            if (updateTask.isSuccessful) {
                                userRepository.createUser(fullName,email,object : UserRepository.UserRepositoryCallback{

                                    override fun onRemoteSuccess() {
                                        listener.onRegistrationSucces()
                                    }

                                    override fun onRemoteFailure(errormsg:String) {
                                        // Since the task is the one who decides if an user is created or not by checking if the email is not duplicated, this callback has no effect on saving a call to Firestore
                                    }
                                })

                            }
                        }

                } else {
                    listener.onRegistrationFailure(task.exception?.message!!)
                }
            }
    }

И я получаю IllegalStateException при выполнении моего теста, это следующее сообщение, которое я получаю

java.lang.IllegalStateException: callbackCaptor !!. Capture () не должен быть нулевым

в com.logintest.presentation.register.presenter.RegisterPresenterTest.should_SignUpUser (RegisterPresenterTest.kt: 123) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) в org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:26) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:78) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.junit.runner.JUnitCore.run (JUnitCore.java:137) в com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:68) в com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs (IdeaTestRunner.java:47) в com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:242) в com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:70)

А строка, в которой указано, что ошибка на тесте

verify(interactor).createUserWithEmailAndPassword("userTest","userEmail@gmail.com","123456", callbackCaptor!!.capture())

Откуда эта ошибка?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...