在我的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为空,因此在对其调用.matcher(email)时会导致NullPointerException。为什么见鬼的Patterns.EMAIL_ADDRESS会返回null?
发布于 2017-05-04 17:14:23
不确定邮件检查,但您的密码检查有错误。假设您只想检查密码是否包含一个数字,则应将其更改为:
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。
发布于 2017-05-04 17:16:24
尝试使用Mockito和mock 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);发布于 2017-05-04 18:34:11
public static boolean validatePassword(String pwd) {
return pwd != null && pwd.matches("((?=.*\\d)(?=.*[A-Z]).{6,})");
}"((?=.*\\d)(?=.*[A-Z]).{6,})"是至少包含一个数字、至少一个大写字母和至少6个字符的正则表达式。
https://stackoverflow.com/questions/43778438
复制相似问题