Не могу издеваться над android.util.Patterns.EMAIL_ADDRESS.pattern () - PullRequest
0 голосов
/ 27 июня 2018

В настоящее время я использую библиотеку 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;
}}

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Попробуйте использовать

PatternsCompat.EMAIL_ADDRESS.pattern()

вместо

Patterns.EMAIL_ADDRESS.pattern()

, который сделал работу для меня.

0 голосов
/ 13 июля 2018

Вместо непосредственного использования 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 в качестве зависимости и смоделируйте ее для теста

...