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)
}