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

Rai*_*rav 0 java testing android

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

这是我的 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();
   }

 }
Run Code Online (Sandbox Code Playgroud)

“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));

    }

}
Run Code Online (Sandbox Code Playgroud)

错误:java.lang.NullPointerException 在这一行:

Matcher matcher = pattern.matcher(email);
Run Code Online (Sandbox Code Playgroud)

在 CommonFunction 类的 isEmailValid 方法中

“模式”仍然为空

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

提前致谢

Aka*_*bey 8

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


Mic*_*odd 5

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

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

您要么需要Patterns.EMAIL_ADDRESS从头开始定义自己,要么将此测试作为/androidTest. 或者,看看使用Robolectric,因为它提供了用于本地 JUnit 测试的 Android SDK 实现。