【问题标题】:NullPointerException on validating email验证电子邮件时出现 NullPointerException
【发布时间】:2016-05-18 14:33:20
【问题描述】:

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

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)

【问题讨论】:

  • LoginService 里面是什么?
  • @ShreeKrishna 我有一个验证方法来进行验证。因为我添加了有问题的登录信息。
  • 向我们展示您的方法 LoginService.validate
  • 如果这是您获得 NPE 的那一行,则看起来 android.util.Patterns.EMAIL_ADDRESSnull
  • @Axel 是的。我不能在单元测试中使用 android.util 吗?

标签: java android android-studio junit junit4


【解决方案1】:

使用 PatternsCompat 而不是 Patterns

【讨论】:

  • 为什么 PatternsCompat 有效?模式的字符串是一样的
  • 有趣的PatternsCompat 属于较新的androidx
  • PatternsCompat 成就了我的一天
【解决方案2】:

android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches() 从 API 级别 8 开始存在,可能是您的模拟器比这更早。

所以我建议按照this 答案中的建议添加自定义EMAIL_ADDRESS_PATTERN 字符串并检查它

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

【讨论】:

  • 但是同样的代码在模拟器上也能正常工作。当我通过 Junit 运行时,我不知道为什么 android 为空。
  • 你确定你使用的是最新的JUNIT,比如4。或者你的设备的API级别是兼容的? see测试的要求和规则。
  • 这个问题不是模拟器的问题,而是android sdk版本的问题。在我的情况下,Patterns.EMAIL_ADDRESS 在版本 28 以下按预期工作,但在版本 29 上突然返回 null。
【解决方案3】:

不要使用 Patterns.EMAIL_ADDRESS

您的要求可能与它在逻辑上不匹配。

创建您的自己的正则表达式模式以便更好地使用。

或者你可以参考other custom regex

【讨论】:

  • 正则表达式复杂并不意味着它不正确。如果您必须验证您的简单正则表达式未涵盖的电子邮件怎么办?
  • @Kaizie 是的,你是对的。我的意思是您可以根据需要自定义验证。复杂或简单取决于您的业务逻辑
猜你喜欢
  • 2015-02-15
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多