在我的Android应用程序中,当点击登录按钮时,我从编辑文本中获取输入并将其传递给我的演示者。然后,演示者使用LoginValidator
实用程序类对其进行验证,具体取决于结果是否继续正常登录流程,或者向活动发送消息,通知电子邮件或/和密码无效。
在LoginValidator
的测试类中,我执行以下操作:
public class LoginValidatorTest {
private static final String INVALID_EMAIL = "ewksd";
private static final String VALID_EMAIL = "tom.finet@gmail.com";
private static final String INVALID_PASSWORD = "sjadsaA";
private static final String VALID_PASSWORD = "Asdfgh1d";
@Test
public void shouldValidateInvalidEmail() {
Assert.assertEquals(LoginValidator.validateEmail(INVALID_EMAIL), false);
}
@Test
public void shouldValidateValidEmail() {
Assert.assertEquals(LoginValidator.validateEmail(VALID_EMAIL), true);
}
@Test
public void shouldValidateInvalidPassword() {
Assert.assertEquals(LoginValidator.validatePassword(INVALID_PASSWORD), false);
}
@Test
public void shouldValidateValidPassword() {
Assert.assertEquals(LoginValidator.validatePassword(VALID_PASSWORD), true);
}
}
以下是测试调用的LoginValidator
类:
public class LoginValidator {
/**
* @param email the email to be validated
* @return true if the email is valid
*/
public static boolean validateEmail(String email) {
return email != null && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
/**
*
* @param password the password to be validated
* @return true if the password is valid
*/
public static boolean validatePassword(String password) {
if (password == null)
return false;
else if (password.length() < 6)
return false;
else if (!password.contains("^[0-9]"))
return false;
else if (!password.contains("[A-Z]+"))
return false;
return true;
}
}
当测试运行时,结果如下:
如何修复代码以使所有测试通过?
更新:
以下是密码验证的正则表达式:
通过进一步分析,我得出结论,代码Patterns.EMAIL_ADDRESS
为null,因此在调用.matcher(email)
时会导致NullPointerException。为什么地狱Patterns.EMAIL_ADDRESS
会返回null?
答案 0 :(得分:0)
不确定邮件检查但您的密码检查有错误。 假设您只想检查密码是否包含数字,您应该从以下位置更改:
public static boolean validatePassword(String password) {
if (password == null)
return false;
else if (password.length() < 6)
return false;
else if (!password.matches(".*[0-9]+.*"))
return false;
else if (!password.matches(".*[A-Z]+.*"))
return false;
return true;
}
首都也不正确,因为contains
不接受正则表达式。其中一个选项是使用matches
。
答案 1 :(得分:0)
尝试使用Mockito并模拟LoginValidator,如下所示:
// If you want to create an instance
LoginValidator loginValidator = mock(LoginValidator.class);
// If you need to access static methods from that class
mock(LoginValidator.class);
答案 2 :(得分:0)
public static boolean validatePassword(String pwd) {
return pwd != null && pwd.matches("((?=.*\\d)(?=.*[A-Z]).{6,})");
}
"((?=.*\\d)(?=.*[A-Z]).{6,})"
是至少一个数字,至少一个上限和至少6个字符的正则表达式。
答案 3 :(得分:-1)
发生此问题,是由Patterns.EMAIL_ADDRESS.matcher引起的,这是一个Android方法,因此您既不能在单元测试中使用它(始终为null)也不能对其进行模拟。您无法嘲笑它,因为Mockito不会嘲笑android类。一种解决方案是为电子邮件创建自己的正则表达式。