【问题标题】:android.util.Patterns Unit test returns NullPointerException [duplicate]android.util.Patterns 单元测试返回 NullPointerException [重复]
【发布时间】:2016-12-06 04:24:09
【问题描述】:

我开始在 android 中使用单元测试 我正在尝试测试一种使用以下方法的方法:

android.util.Patterns.EMAIL_ADDRESS.matcher(validEmail).matches()

当我在 build.gradle 中添加它时,它应该返回 true

testOptions { 
    unitTests {
        returnDefaultValues = true
    }
} 

测试仍然会引发 NullPointerException。

我有两个问题: 1-我该如何解决这个问题? 2-我是否应该重新考虑我的设计并删除对模拟对象的 android 依赖项。

// @ LoginPresenterTest
@Test
public void clickOnLogin_loginSuccess(){
    loginPresenter.login(validEmail, validPassword);
    verify(loginView).setLoginButton(false);
}
// LoginPresenter
public void login(String email, String password) {

    loginView.setLoginButton(false);
    if(!isValid(email, password)){
        loginView.setLoginButton(true);
        return;
    }
}
// Validation
public static boolean isEmailValid(String email){
    return !(email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches());
}

当 android.utills 被注释时,它们也不例外。

【问题讨论】:

  • 我不是你的家伙。它可以帮助了解 NPE 是什么。现在你必须使用调试器,找出什么值为 null
  • 我也面临同样的问题。您通常需要模拟 Pattern 以尝试匹配它。但是你不能轻易做到这一点。这个教程很不错:(bytes.babbel.com/en/articles/2016-05-20-tdd-in-android.html) 并逐步展示如何让它工作
  • 这个问题显然与被标记为存在的“重复”无关。
  • “它应该返回 true”是您感到困惑的地方。 unitTests.returnDefaultValues = true 并不意味着android 框架方法会返回true。这意味着它们将返回默认值。 True 不是 matcher() 的默认值,返回对象的方法的默认值是 null,这就是你得到 NPE 的原因。

标签: android unit-testing junit4


【解决方案1】:

static methods 不会被嘲笑。您需要使用一些模拟框架,例如 mockitopowermock

【讨论】:

  • 这不应该总是返回 true tools.android.com/tech-docs/unit-testing-support 最后一节
  • @AbdelrhmanTalat unitTests.returnDefaultValues = true 表示android框架模拟的方法将返回默认值,而不是它们应该返回的值是true。返回对象的方法的默认值是null,这就是您获得 NPE 的原因。
  • 为了扩展这个答案,no Android 框架方法默认是模拟的,你必须自己模拟它们。你不能用 Mockito 来模拟静态方法(虽然他们似乎正在研究它)。 You can do it with PowerMock.
猜你喜欢
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
相关资源
最近更新 更多