【问题标题】:Mock android Patterns with mockito用 mockito 模拟 android 模式
【发布时间】:2017-05-21 22:55:45
【问题描述】:

我想使用 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)

编辑 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()) 返回总是假的。这令人困惑。

【问题讨论】:

标签: android unit-testing mockito powermockito


【解决方案1】:

在这种特殊情况下,无需使用 mockito 模拟 Patterns 类(无论如何它是不可模拟的),只需将源代码更改如下:

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

应该是

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

这为我完成了这项工作。

【讨论】:

  • 它有效,但我不明白两者之间的区别。你能解释一下吗?
  • 这应该是选择的答案,更改或使用新库并不总是可能的,但这个答案通过微小的变化解决了问题
【解决方案2】:

在这种情况下使用Robolectric 可以省去很多麻烦。

【讨论】:

  • 使用 Robolectric 删除了 NPE 太棒了!!但它只在我的个人项目中这样做,但在我的工作代码库中,即使遵循相同的步骤,它仍然产生 NPE。有什么你能想到的可能导致这种情况的原因
【解决方案3】:
【解决方案4】:

您正在执行电子邮件字段的验证

当返回 true 或 false 时,您不是在嘲笑这里的行为。另请注意,我们不能模拟最终类(模式)。

当正则表达式匹配它返回真或假的值时

而不是使事情复杂化。只需通过传递值来执行验证。

解决方案 1:

     @Test
        public void test() throws Exception{            
            String email="hello@gmail.com";         
            System.out.println(Patterns.EMAIL_ADDRESS.matcher(email).matches());    

        }



 protected static class Patterns{


            private static final String EMAIL_PATTERN =
                    "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
                    + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
            private static final Pattern EMAIL_ADDRESS=Pattern.compile(EMAIL_PATTERN);



        }
output :

true

解决方案 2:模拟 Matcher 行为以返回 true 或 false

 @RunWith(PowerMockRunner.class)
    @PrepareForTest({Pattern.class,Matcher.class})
    public class TestEmailPattern {


            @Test
            public void test() throws Exception{            
                String email="hello@gmail.com";         
                Pattern pattern=PowerMockito.mock(Pattern.class);
                Matcher matcher=PowerMockito.mock(Matcher.class);
                PowerMockito.when(matcher.matches()).thenReturn(true);      
                assertEquals(Patterns.EMAIL_ADDRESS.matcher(email).matches(),true); 
            }

            protected static class Patterns{


                private static final String EMAIL_PATTERN =
                        "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
                        + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
                private static final Pattern EMAIL_ADDRESS=Pattern.compile(EMAIL_PATTERN);



            }


    }

【讨论】:

  • 模式模式=PowerMockito.mock(Pattern.class);从未使用过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多