0

I am very new at writing tests and I am trying to write a simple one to check that the email the user writes for the login is valid. I got the way to do it from a tutorial and it makes sense the way it works but for some reason I am getting the NullPointerException even though I am not sure why. Any ideas about it would help.

This is the login view model part that I want to test:

class LoginViewModel @ViewModelInject constructor(
    private val loginRepository: LoginRepository,
    private val preference: Preferences
) : ViewModel() {

    private val _loginForm = MutableLiveData<LoginFormState>()
    val loginFormState: LiveData<LoginFormState> = _loginForm

    //validate all login fields
    fun loginDataChanged(email: String, password: String) {
        if (!isEmailValid(email)) {
            _loginForm.value = LoginFormState(emailError = R.string.error_state_msg_invalid_email)
        } else if (!isPasswordValid(password)) {
            _loginForm.value = LoginFormState(passwordError = R.string.error_state_msg_invalid_password_signUp)
        } else {
            _loginForm.value = LoginFormState(isDataValid = true)
        }
    }

    //validate email
    private fun isEmailValid(email: String): Boolean {
        return Patterns.EMAIL_ADDRESS.matcher(email).matches()
    }

    //validate password
    private fun isPasswordValid(password: String): Boolean {
        val PASSWORD_PATTERN = "^(?=.*\\d)(?=.*[a-z])(?=.*[a-zA-Z]).{8,}\$"
        val pattern = Pattern.compile(PASSWORD_PATTERN)
        val matcher = pattern.matcher(password)

        return matcher.matches()
    }
}

This is the testing part:

@RunWith(MockitoJUnitRunner::class)
class LoginViewModelTest {

    @Mock
    private lateinit var repository: LoginRepository

    @Mock
    private lateinit var viewModel: LoginViewModel

    @Mock
    private lateinit var preferences: Preferences

    @Rule
    @JvmField
    val instantTaskExecutorRule = InstantTaskExecutorRule()

    val invalidEmail = ""
    val invalidPassword = ""
    val validEmail = "test@email.com"
    val validPassword = "test12345"

    @Before
    fun setUp() {
        viewModel = LoginViewModel(repository, preferences)
    }

    @Test
    fun `loginDataChanged with invalid email should set loginFormState as error`() {
        viewModel.loginDataChanged(invalidEmail, validPassword)
        assert(viewModel.loginFormState.value?.emailError != null)
    }
dazai
  • 766
  • 4
  • 25

0 Answers0