Исключение нулевого указателя, переданное методом теста - PullRequest
0 голосов
/ 17 июня 2019

Метод, который необходимо протестировать - находится в классе AnalyticsServiceImpl.java

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

Тестовый класс

@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 Ответ

1 голос
/ 17 июня 2019

1) Вы издеваетесь над 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

UPDATE:

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