无法模拟android.util.Patterns.EMAIL_ADDRESS.pattern()

时间:2018-06-27 09:37:27

标签: android junit4 mockk

当前,我正在使用MockK库(版本1.8.1)在Android Dev中进行单元测试,而我的问题是我无法模拟Patterns.EMAIL_ADDRESS。 每次调用此属性时,测试用例都会抛出NPE。

我尝试了mockkStatic(Patterns::class),但是@Before方法在应用规则every { Patterns.EMAIL_ADDRESS.pattern() } returns EMAIL_REGEX_STRING时因NPE而崩溃。

我要测试的班级:

public class EmailValidator {

private static final String EMPTY = "";
private final Context context;

@Inject
public EmailValidator(Context context) {
    this.context = context;
}

public String isValidEmail(String email) {
    if (StringUtils.isEmpty(email)) {
        return context.getString(R.string.sign_up_error_email_empty);
    }

    if (!email.matches(Patterns.EMAIL_ADDRESS.pattern())) {
        return context.getString(R.string.sign_up_error_email_validate);
    }
    return EMPTY;
}}

2 个答案:

答案 0 :(得分:1)

您可以直接创建一个包装器,然后模拟或伪造该包装器,而不是直接使用Patterns.EMAIL_ADDRESS

包装器可以是一种方法,例如:

class EmailValidator {
    fun isValidEmail(email: String) {
        if (StringUtils.isEmpty(email)) {
            return context.getString(R.string.sign_up_error_email_empty);
        }

        if (!email.matches(getEmailPattern())) {
            return context.getString(R.string.sign_up_error_email_validate);
        }
    }

    private fun getEmailPattern(): String = Patterns.EMAIL_ADDRESS.pattern()
}

您的测试可能会像这样模拟它:

@Test
fun `test email validator`() {
    val validator = spyk(EmailValidator())

    every { validator["getEmailPattern"]() } returns yourTestPattern

    assertThat(validator.isValidEmail("blah blah blah")).isFalse()
}

或创建一个包装它的类,也许是PatternFactory类

class PatternFactory {
    fun getEmailPattern(): String = ...
    fun getVinPattern(): String = ...
}

然后将PatternFactory作为依赖项传入并对其进行模拟以进行测试

答案 1 :(得分:0)

尝试使用

PatternsCompat.EMAIL_ADDRESS.pattern()

而不是

Patterns.EMAIL_ADDRESS.pattern()

为我完成了工作。