Patterns.EMAIL_ADDRESS返回null

时间:2018-04-10 14:53:00

标签: android unit-testing junit

@RunWith(MockitoJUnitRunner.Silent.class)
    public class LoginActivityTest {

        @InjectMocks
        LoginActivity loginActivity;

        private Pattern emailPattern;

        @Before
        public void createLogin(){
            this.emailPattern = Patterns.EMAIL_ADDRESS;
        }

        @Test
        public void checkValidation(){
            mock(LoginActivity.class);
            UserVO userVO = new UserVO();
            userVO.setEmailID("invalid");
            userVO.setPassword("a");

            boolean b = loginActivity.validatesFields(userVO);

            assertFalse(b);

        }
    }

this.emailPattern = Patterns.EMAIL_ADDRESS;这是在MockitoJunitTestClass中创建空指针对象。但是,当我在Activity上运行它时,它会被正确初始化。

2 个答案:

答案 0 :(得分:0)

我对你的考试有点困惑:

你在嘲笑LoginActivity.class但没有设置任何东西。我相信你想做loginActivity = mock(LoginActivity.class);之类的事情。

此外,你正在嘲笑反而监视类,所以它不会访问真正的方法来验证这个方法的流程。换句话说,你的测试实际上什么也没做。

最后,这个emailPattern从未在你的测试中使用过(可能它用在你的代码上),所以我相信你想要嘲笑它(我假设它)。我建议你做的是这样的:

@RunWith(MockitoJUnitRunner.Silent.class)
public class LoginActivityTest {

    @Spy
    @InjectMocks
    private LoginActivity loginActivity;

    @Mock
    private OtherStuff otherStuff;

    @Test
    public void checkValidation(){
        UserVO userVO = new UserVO();
        userVO.setEmailID("invalid");
        userVO.setPassword("a");

        doReturn(Patterns.EMAIL_ADDRESS).when(otherStuff).doStuff();

        boolean result = loginActivity.validatesFields(userVO);

        assertFalse(result);
    }
}

我在这里所做的只是一个单元测试的例子,它验证validateFields()正在做什么。我想在这个方法中你有一些方法,我将其命名为otherStuff,它调用一个返回Patterns.EMAIL_ADDRESS的方法,这就是你要模拟的方法。

如果您在此处插入LoginActivity代码更精确,那会更好,但我希望我帮助过您。

答案 1 :(得分:0)

我遇到了类似的问题,因为它只是一个简单的测试,但是当我添加@RunWith(AndroidJUnit4::class)时,此问题已解决。检查此测试是否必须与Android资源一起运行。