繁体   English   中英

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

[英]Can't mock android.util.Patterns.EMAIL_ADDRESS.pattern()

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

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

我正试图测试的类:

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;
}}

尝试使用

PatternsCompat.EMAIL_ADDRESS.pattern()

而不仅仅是

Patterns.EMAIL_ADDRESS.pattern()

那对我有用。

您可以在它周围创建一个包装器,然后模拟或伪造包装器,而不是直接使用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作为依赖项传递并模拟它以进行测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM