验证android

时间:2017-05-04 09:05:11

标签: android regex validation junit

在我的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;
    }
}

当测试运行时,结果如下:

enter image description here

enter image description here

enter image description here

enter image description here

如何修复代码以使所有测试通过?

更新:

以下是密码验证的正则表达式:

enter image description here

通过进一步分析,我得出结论,代码Patterns.EMAIL_ADDRESS为null,因此在调用.matcher(email)时会导致NullPointerException。为什么地狱Patterns.EMAIL_ADDRESS会返回null?

4 个答案:

答案 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类。一种解决方案是为电子邮件创建自己的正则表达式。