java - 测试方法传递空指针异常

标签 java android unit-testing mockito android-testing

Method that needs to be tested - located in AnalyticsServiceImpl.java class

public void trackSplashState(MeasurementViewEnum measurementViewEnum) {
    HashMap<String, Object> data = createCommonData(measurementViewEnum);
    MeasureServiceImpl.StartStatus status = mMeasureService.getLaunchStatus();
    switch (status) {
        case INSTALL:
            data.put(APP_EVENT_INSTALL, INSTALL);
            break;
        case LAUNCH:
            data.put(APP_EVENT_LAUNCH, LAUNCH);
            break;
        case UPDATE:
            data.put(APP_EVENT_UPDATE, UPDATE);
            break;
    }
    trackState(measurementViewEnum, data);
}

Test class

@Config(constants = BuildConfig.class, sdk = TestConfig.SDK)
@RunWith(RobolectricTestRunner.class)
public class AnalyticsServiceImplTest {

    @Module(includes = TestAppModule.class, injects = AnalyticsServiceImplTest.class, overrides = true)
    static class TestModule {
    }

    @Inject
    AnalyticsServiceImpl analyticsServiceImpl;
    @Inject
    MeasureServiceImpl measureService;
    @Inject
    Context mContext;
    @Inject
    LoginService mLoginService;

    @Captor
    ArgumentCaptor<HashMap<String, Object>> data;

    @Captor
    ArgumentCaptor<String[]> varargs;

    private ArgumentCaptor<MeasurementViewEnum> enumArgumentCaptor;

    @Before
    public void setUp() throws Exception {
        Services.initialize(new AnalyticsServiceImplTest.TestModule()).inject(this);
        enumArgumentCaptor = ArgumentCaptor.forClass(MeasurementViewEnum.class);
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void trackSplashState_shouldReturnInstall_whenLaunchStatusEqualsINSTALL() throws Exception {
        analyticsServiceImpl = mock(AnalyticsServiceImpl.class);
        MeasureServiceMock measureServiceMock = new MeasureServiceMock();
        measureServiceMock.setStatus(MeasureServiceImpl.StartStatus.INSTALL);
        analyticsServiceImpl.mMeasureService = measureServiceMock;
        analyticsServiceImpl.trackSplashState(MeasurementViewEnum.SPLASH);
        verify(analyticsServiceImpl, times(1)).trackState(enumArgumentCaptor.capture(), data.capture());
    }
}

当我运行这个测试用例时,我在最后一行遇到了空指针异常。我对单元测试有点陌生。你能解释一下我在这段代码中犯了什么错误吗?

最佳答案

1) 您正在 mock 根本无法工作的 SUT:

analyticsServiceImpl = mock(AnalyticsServiceImpl.class);

您将验证其 trackState 方法,因此您需要监视它:

analyticsServiceImpl = spy(new AnalyticsServiceImpl());

2) 您正在捕获输入,但没有以任何方式断言它们。我猜你错过了:

verify(analyticsServiceImpl, times(1)).trackState(enumArgumentCaptor.capture(), data.capture());
Map<String, Object> dataCaptured = data.getValue();
MeasurementViewEnum enumCapture = enumArgumentCaptor.getValue();

// assert these values

更新:

@Before
public void setUp() throws Exception {
   MockitoAnnotation.initMocks(this);
}

关于java - 测试方法传递空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627469/

相关文章:

java - Glassfish 2 在 Glassfish 4 上的应用程序 : "Cannot resolve reference... because there are 2 ejbs in the application"?

java - Hibernate 生成计数(1)

java - JSP 中的服务器端重定向和客户端重定向 - 哪个更好?

android - 我可以始终使用 lint 忽略 NewApi 而不是不同的 styles.xml 文件吗?

angular - 失败 : Uncaught (in promise): Error: Cannot match any routes. URL 段 : 'login' . Jasmine & Angular 6

linux - 关闭第三方代码的单元测试执行

angular - 如何在 nrgx 8 单元测试中模拟选择器?

java - Android向ArrayList添加数据时出错

java - Android 检查什么 fragment 发送了 onClick 操作

android - 我无法在运行在 VMware 上的 Ubuntu 上的 Android 设备上进行调试