当前,我正在使用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;
}}
答案 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()
为我完成了工作。