![](/img/trans.png)
[英]Android android.util.Patterns.EMAIL_ADDRESS strange behaviour
[英]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.