在方法内局部访问静态最终字段的测试方法给出错误

时间:2017-05-18 10:31:12

标签: java android testing

我是测试的新手,我在测试下面的代码时遇到了这个问题,给出了空指针异常。

这是我的CommonFunctions类,其中包含电子邮件验证方法

源文件----->

import android.util.Patterns;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CommonFunctions {

   private Context context;

   public CommonFunctions(Context context) {
      this.context = context;
    }


   //to check whether email is valid or not

    public boolean isEmailValid(String email) {
      Pattern pattern = Patterns.EMAIL_ADDRESS;
      Matcher matcher = pattern.matcher(email);
      return matcher.matches();
   }

 }

“Patterns.EMAIL_ADDRESS”来自android.util.Patterns EMAIL_ADDRESS是静态最终字段

我的测试代码使用Junit和Mockito

   import android.content.Context;

   import org.junit.Test;
   import org.junit.runner.RunWith;
   import org.mockito.Mock;
   import org.mockito.runners.MockitoJUnitRunner;

   import static org.hamcrest.CoreMatchers.is;
   import static org.junit.Assert.*;


    @RunWith(MockitoJUnitRunner.class)
    public class CommonFunctionsTest {

    @Mock
    Context mMockContext;


    @Test
    public void isEmailValid() throws Exception {

       CommonFunctions commonFunctions = new CommonFunctions(mMockContext);
        assertThat(commonFunctions.isEmailValid("name@gmail.com"), is(true));

    }

}

错误:此行的java.lang.NullPointerException:

Matcher matcher = pattern.matcher(email);

在CommonFunction类的isEmailValid方法

'模式'仍为空

这意味着在测试时我无法从android.util.Patterns访问“Patterns.EMAIL_ADDRESS”,EMAIL_ADDRESS是静态最终字段

提前致谢

2 个答案:

答案 0 :(得分:3)

  

“Patterns.EMAIL_ADDRESS”来自 android.util .Patterns

如果您将其创建为标准单元测试(在/test中),则JUnit不使用Android框架。任何特定于Android的方法都是存根的,无法运行。

您需要从头开始定义Patterns.EMAIL_ADDRESS或在/androidTest中将此测试作为Instrumentation测试运行。或者,请查看使用Robolectric,因为它提供了Android SDK的实现,以便在本地JUnit测试中使用。

答案 1 :(得分:2)

刚刚通过从 Patterns.EMAIL_ADRESS.matcher() 切换到 PatternsCompat.EMAIL_ADRESS.matcher() 解决了它。这应该有效。