验证电子邮件时出现空指针异常

8

我正在编写一个单元测试来检查电子邮件验证逻辑。在运行测试时,该逻辑会抛出空指针异常。但是使用模拟器可以正常工作。有人能帮我解决这个问题吗?

public static String validate(String email, String password) {
        if (email == null || email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
            return "Enter valid email address";
        }
        if (password.isEmpty() || password.length() < 4) {
            return "Password should be between 4 and 10 alphanumeric characters";
        }
        return null;
}

以下是我的单元测试。
@Test
public void validateShouldReturnMessageIfYouPassAnInvalidEmail() throws Exception {
    String validateMessage = LoginService.validate("abcdef", "password");
    assertEquals("Enter valid email address", validateMessage);
}

我遇到的错误是:
java.lang.NullPointerException
at com.tryout.hemanth.expensetracker.service.LoginService.validate(LoginService.java:11)

1
LoginService 里面有什么? - Shree Krishna
@ShreeKrishna 我有一个验证方法来进行验证。因为我已经在问题中添加了我的登录信息。 - Hemanth S R
1
如果您在此行遇到了NPE,则看起来android.util.Patterns.EMAIL_ADDRESSnull - Axel
@Axel 是的。我不能在单元测试中使用android.util吗? - Hemanth S R
你尝试过使用正则表达式或删除那一行吗?它是否运行良好? - Shree Krishna
显示剩余6条评论
4个回答

24

请使用PatternsCompat代替Patterns


为什么PatternsCompat有效?模式字符串是相同的。 - Massimo
1
有趣的 PatternsCompat 属于较新的 androidx 库。 - cutiko
1
PatternsCompat 让我的一天变得更美好。 - Mohd Qasim

2

android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches() 自 API level 8 开始存在,可能你的模拟器版本比这个更早。

所以我建议按照这个答案的建议添加自定义的EMAIL_ADDRESS_PATTERN字符串,并像下面这样检查:

if (email == null || email.isEmpty() || !EMAIL_ADDRESS_PATTERN.matcher(email).matches()){
     return "Enter valid email address";
}

但是相同的代码在模拟器上运行良好。我不知道为什么当我通过Junit运行它时,Android为空。 - Hemanth S R
你确定你正在使用JUNIT最新版本4吗?或者你的设备API级别兼容吗?请参见测试的要求和规则链接 - Shree Krishna
这个问题不是由模拟器引起的,而是由Android SDK版本引起的。在我的情况下,Patterns.EMAIL_ADDRESS在28版本以下按预期工作,但在29版本上突然返回null。 - Amey Bhandarkar

1

如果 Patterns.EMAIL_ADDRESS 与您的要求不符合,请创建您自己的正则表达式模式以获得更好的使用体验。

例如,请参考 this EMAIL ADDRESS regex


正则表达式复杂并不意味着它是错误的。如果您需要验证电子邮件,而您简单的正则表达式无法覆盖该情况,那该怎么办? - Kaizie
@Kaizie 是的,你说得对。我的意思是你可以根据自己的需要自定义验证。复杂或简单取决于你的业务逻辑。 - Necromancer

0
尝试一下这个,对我来说有效:

试试这个,对我有用:

fun isValidEmail(email:String?):Boolean {
return when{
    email.isNullOrEmpty()-> false
    else-> PatternsCompat.EMAIL_ADDRESS.matcher(email).matches();
}

}

测试用例:

 @Test
fun validate_email_invalid() {
    val email = "a"
    Assert.assertEquals(false, isValidEmail(email))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接