使用mockito模拟android模式

2024-01-15

我想使用 Android 提供的一些代码来验证电子邮件。

这是我要模拟的代码:

 if(!Patterns.EMAIL_ADDRESS.matcher(email).matches())
      throw new InvalidPhoneException(phone);

在我的测试文件中:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Patterns.class })
public class UserTest {

    @Before
    public void mockValidator() {
        mockStatic(Patterns.class);
        when(Patterns.EMAIL_ADDRESS.matcher(any(String.class)).matches()).thenReturn(true);
    }

当我启动测试时出现此错误:

java.lang.NullPointerException
    at ch.mycompany.myapp.model.UserTest.mockValidator(UserTest.java:59)

EDIT 1 :

我试过 :

    mockStatic(Patterns.class);
    Field field = PowerMockito.field(Patterns.class, "EMAIL_ADDRESS");
    field.set(Patterns.class, mock(Pattern.class));

    // prepare matcher
    Matcher matcher = mock(Matcher.class);
    when(matcher.matches())
            .thenReturn(true);

    // final mock
    when(Patterns.EMAIL_ADDRESS.matcher(any(String.class)))
            .thenReturn(matcher);

但是当我这样做时,我的代码 (Patterns.EMAIL_ADDRESS.matcher(email).matches()) 返回始终为假。这很令人困惑。


在这种特殊情况下,没有必要使用mockito来模拟Patterns类(无论如何它都是不可模拟的),只需按如下所示更改源代码:

 if(!Patterns.EMAIL_ADDRESS.matcher(email).matches())
  throw new InvalidPhoneException(phone);

应该

 if(!PatternsCompat.EMAIL_ADDRESS.matcher(email).matches())
  throw new InvalidPhoneException(phone);

这对我来说是件好事。

Replace Patterns with PatternsCompat

from androidx.core.util.PatternsCompat

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用mockito模拟android模式 的相关文章

随机推荐