es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prueba de error en el inicio de sesión de Firebase con Mockito.

Tengo un formulario de inicio de sesión que inicia sesión del usuario utilizando Firebase y estoy tratando de probar la funcionalidad de inicio de sesión escribiendo código y usando Mockito para simular la clase de Firebase, pero para alguien no está funcionando y creo que hay algo mal. Si alguien pudiera ayudar a solucionar el problema, gracias.

Este es mi código:

@RunWith(AndroidJUnit4ClassRunner::class)
class LoginActivityTest {

    @get:Rule
    var scenario = ActivityScenarioRule(LoginActivity::class.java)
    private lateinit var emailEditText : TextInputLayout
    private lateinit var passwordEditText : TextInputLayout
    private lateinit var firebaseUser: FirebaseUser

    @Test
    fun testCaseRealUserLogin(){

        scenario.scenario.onActivity { it ->
            emailEditText = it.findViewById(R.id.loginEmail)
            passwordEditText = it.findViewById(R.id.loginPassword)
        }

        Looper.prepare()
        emailEditText.editText!!.setText("xxxxxx@gmail.com")
        passwordEditText.editText!!.setText("xxxxxx")

        onView(withId(R.id.loginBtn)).perform(click())

        //Simulando Firebase
        val firebaseMock  = mock(FirebaseAuth::class.java)
        `when`(firebaseMock.signInWithEmailAndPassword("xxxxxxx","xxxxxxx"))
            .thenReturn(notNull())

        firebaseUser = firebaseMock.currentUser!!

        assertNotNull(firebaseUser)
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar relacionado con la forma en que se utiliza la simulación de Firebase. Estás simulando el método signInWithEmailAndPassword, pero no estás usando la instancia simulada de FirebaseAuth para iniciar sesión realmente. En su lugar, estás llamando a firebaseMock.currentUser!!, lo cual puede que no te dé el resultado esperado.

    Para solucionar este problema, debes inyectar la instancia simulada de FirebaseAuth en la clase LoginActivity (o en su marco de inyección de dependencias) y usarla para iniciar sesión del usuario. De esta manera, la autenticación real de Firebase utilizará el objeto simulado y devolverá los resultados esperados.

    También es importante tener en cuenta que al usar Mockito, debes utilizar el método verify() para comprobar que un método se haya llamado con los argumentos esperados. En este caso, es posible que desees verificar que se haya llamado a signInWithEmailAndPassword con los valores de correo electrónico y contraseña correctos.

    En general, el código revisado podría verse así:

    @RunWith(AndroidJUnit4ClassRunner::class)
    class LoginActivityTest {
    
        @get:Rule
        var scenario = ActivityScenarioRule(LoginActivity::class.java)
        private lateinit var emailEditText : TextInputLayout
        private lateinit var passwordEditText : TextInputLayout
        private lateinit var firebaseAuthMock: FirebaseAuth
    
    
        @Before
        fun setUp() {
            firebaseAuthMock = mock(FirebaseAuth::class.java)
        }
    
        @Test
        fun testCaseRealUserLogin(){
    
            scenario.scenario.onActivity { it ->
                emailEditText = it.findViewById(R.id.loginEmail)
                passwordEditText = it.findViewById(R.id.loginPassword)
            }
    
            Looper.prepare()
            emailEditText.editText!!.setText("xxxxxx@gmail.com")
            passwordEditText.editText!!.setText("xxxxxx")
    
            onView(withId(R.id.loginBtn)).perform(click())
    
            //Simulando firebase
            `when`(firebaseAuthMock.signInWithEmailAndPassword("xxxxxx@gmail.com","xxxxxx"))
                .thenReturn(mock(Task::class.java))
            //... suponiendo que la tarea de inicio de sesión se devolverá como un objeto simulado
    
            //Inyectar el objeto simulado en LoginActivity (o en su marco de inyección de dependencias) 
            //para el proceso de autenticación real
            val loginActivity = scenario.scenario.activity
            loginActivity.authService = AuthService(firebaseAuthMock)
    
            //Activar el proceso de inicio de sesión
            loginActivity.doSignIn()
    
            //Verificar que el método de inicio de sesión se haya llamado con los argumentos esperados
            verify(firebaseAuthMock).signInWithEmailAndPassword("xxxxxx@gmail.com","xxxxxx")
    
        }
    }
    

    Por supuesto, es posible que necesites ajustar el código en función de los requisitos y la arquitectura específica de tu proyecto.

Comments are closed.