Ошибка Mockito - «с этим макетом не было никаких взаимодействий» - PullRequest
1 голос
/ 05 июня 2019
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    // Send SiteCatalyst data

    //create trigger to adobe analytics when the view visible
    mMeasurement = MeasurementWrapper.create(MeasurementEnum.SPLASH);
    mMeasurement.trackSplashState();

здесь я вызвал trackSplashState внутри метода onCreate на экране-заставке.

   @Override
    public void trackSplashState() {
        HashMap<String, Object> data = createCommonData();
        MeasureServiceImpl.StartStatus status = mMeasureService.getLaunchStatus();
        switch (status) {
            case INSTALL: {
                data.put("appevent.install", "install");
                break;
            }
            case LAUNCH: {
                data.put("appevent.launch", "launch");
                break;
            }
            case UPDATE: {
                data.put("appevent.update", "update");
                break;
            }
        }
        mAnalyticsService.trackState(mType, data);
    }

Функциональные возможности метода внутри класса MeassurementWrapper.java

@Override
public void trackState(MeasurementEnum mType, HashMap<String, Object> data, String... additionalData) {
    try {
        String stateName = MeasurementWrapper.DEVICE_NAME + ":" + String.format(mType.getName(), additionalData);
        // Check last Adobe Analytic page value is same to the current page value if so avoiding it send to the Adobe analytics tracking
        if (!isPageAndUrlMatching(mType,data)) {
            Analytics.trackState(stateName, data);
        }
    } catch (MissingFormatArgumentException e) {
        Log.e(this.getClass().getName(), e.getMessage());
    }
}

Реализация метода trackState внутри сервиса (AnalyticsServiceImpl).

    <-------- Test Class -------------->
@Config(constants = BuildConfig.class, sdk = TestConfig.SDK)
@RunWith(RobolectricTestRunner.class)
public class AdobeAnalyticsTriggerTest {

    private ArgumentCaptor<MeasurementEnum> enumArgumentCaptor;

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

    @Inject
    Context context;

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

    @Captor
    ArgumentCaptor<String[]> varargs;

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

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void shouldTrackSplashscreen_afterOnCreate(){
        SplashActivity splashActivity = Robolectric.buildActivity(SplashActivity.class).create().get();
        Measurement measurement = mock(splashActivity.mMeasurement);
        verify(((MeasurementWrapper) measurement).mAnalyticsService, times(1)).trackState(enumArgumentCaptor.capture(), data.capture());

    }

    /**
     * Mocks measurement (so stuff is not sent to sitecatalyst)
     * @return measurement
     */
    private Measurement mock(Measurement measurement) {
        MeasurementWrapper wrapper = (MeasurementWrapper) measurement;

        wrapper.mAnalyticsService = Mockito.spy(new AnalyticsServiceImpl());

        // overwrite sendTrackAction() to prevent logs being sent somewhere
        doAnswer(invocationOnMock -> null).when(wrapper.mAnalyticsService).trackAction(any(MeasurementEnum.class), (HashMap) anyMapOf(String.class, Objects.class));

        // overwrite sendStateAction() to prevent logs being sent somewhere
        doAnswer(invocationOnMock -> null).when(wrapper.mAnalyticsService).trackState(any(MeasurementEnum.class), (HashMap) anyMapOf(String.class, Objects.class));

        return wrapper;
    }

Мне нужно проверить ( shouldTrackSplashscreen_afterOnCreate ) trackStateметод AnalyticsServiceImpl, вызываемый при вызове метода заставки onCreate.Но проблема в том, что я всегда получаю ошибку от Mockito, что На самом деле, с этим макетом * 022 * не было никаких взаимодействий. Может кто-нибудь помочь мне решить эту проблему.Это будет большая помощь для меня.Спасибо и всего наилучшего.

1 Ответ

0 голосов
/ 08 июня 2019

Вам нужно добавить тестовый код между макетом и частью проверки, пример см. Ниже.

В настоящее время вызов макета не выполняется, поэтому вы получаете сообщение об ошибке из mockito.

    @Test
    public void shouldTrackSplashscreen_afterOnCreate(){
        SplashActivity splashActivity = Robolectric.buildActivity(SplashActivity.class).create().get();
        Measurement measurement = mock(splashActivity.mMeasurement);

        // ... add test code here ...

        verify(((MeasurementWrapper) measurement).mAnalyticsService, times(1)).trackState(enumArgumentCaptor.capture(), data.capture());

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...