【问题标题】:NPE on unit test using mockito使用 mockito 进行单元测试的 NPE
【发布时间】:2018-10-04 03:31:50
【问题描述】:

我尝试对一些 util 类进行单元测试,如下:

public final class WalletInputValidationUtils {
private WalletInputValidationUtils() {
}

public static boolean isEmailValid(CharSequence email) {
    return Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
}

这是测试类

@RunWith(PowerMockRunner.class)
public class WalletInputValidationUtilsTest {
private static final CharSequence DUMMY_EMAIL = "email@gmail.com";

@Test
public void isEmailValidTest1() {
    Assert.assertTrue(isEmailValid(DUMMY_EMAIL));
}
}

我在这一行遇到空指针异常

return Patterns.EMAIL_ADDRESS.matcher(email).matches();

这是堆栈跟踪

java.lang.NullPointerException
at kudo.mobile.app.wallet.backwardcompatibility.WalletInputValidationUtils.isEmailValid(WalletInputValidationUtils.java:14)
at kudo.mobile.app.wallet.backwardcompatibility.WalletInputValidationUtilsTest.isEmailValidTest(WalletInputValidationUtilsTest.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:316)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:300)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunne

谁能帮我解决这个问题?谢谢

【问题讨论】:

  • 你需要显示你的堆栈跟踪以及这个类Patterns.EMAIL_ADDRESS的内容是什么。
  • @GMsoF 更新问题,Patterns.EMAIL_ADDRESS 其实是 android.util 包developer.android.com/reference/android/util/Patterns
  • 你能在你的方法中打印出这三个对象吗isEmailValid: 1) Patterns.EMAIL_ADDRESS 2) Patterns.EMAIL_ADDRESS.matcher(email) 3) email
  • 1. Nullpointer 异常 2. Nullpointer 异常 3. "email@gmail.com" @GMsoF
  • 您是否尝试使用 PowerMock 模拟 Patterns 类?我认为你需要分享你的整个/完整的源文件,要么你做错了模拟,要么你错误地导入了类。

标签: java android unit-testing mockito


【解决方案1】:

刚刚通过从Patterns.EMAIL_ADRESS.matcher() 切换到PatternsCompat.EMAIL_ADRESS.matcher() 解决了这个问题。应该可以的。

【讨论】:

    【解决方案2】:

    我获得了 NPE,因为 Patterns.EMAIL_ADDRESS 在我的单元测试中为空。切换到android.support.v4.util.PatternsCompat 解决了这个问题

    【讨论】:

      【解决方案3】:

      认为它应该匹配:

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

      【讨论】:

        【解决方案4】:

        你应该得到预期的输出,而不是模拟模式。

        推荐使用Robolectric

        代码sn-p如下:

        import android.os.Build;
        import android.util.Patterns;
        
        import org.junit.Test;
        import org.junit.runner.RunWith;
        import org.robolectric.RobolectricTestRunner;
        import org.robolectric.annotation.Config;
        
        import static com.google.common.truth.Truth.assertThat;
        import static org.junit.Assert.assertEquals;
        
        @RunWith(RobolectricTestRunner.class)
        @Config(sdk = Build.VERSION_CODES.P)
        public class ExampleUnitTest {
            @Test
            public void mobileNumber_passedValidNumber_success() {
                assertThat(Patterns.PHONE.matcher("+919895123456").matches()).isTrue();
            }
        
            @Test
            public void mobileNumber_passedInvalidNumber_error() {
                assertThat(Patterns.PHONE.matcher("+91+9895123456").matches()).isFalse();
            }
        
            @Test
            public void email_passedValidEmail_success() {
                assertThat(Patterns.EMAIL_ADDRESS.matcher("android.developer@gmail.com").matches()).isTrue();
            }
        
            @Test
            public void email_passedInvalidEmail_error() {
                assertThat(Patterns.EMAIL_ADDRESS.matcher("android.developer@gmail.com@in").matches()).isFalse();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-22
          • 1970-01-01
          • 1970-01-01
          • 2017-11-22
          • 2017-09-19
          • 2019-04-27
          相关资源
          最近更新 更多