jacoco показывает строки как незакрытые, хотя строки выполняются во время выполнения кода

У меня есть приведенные ниже строки кода, которые указаны как не «исполняемые» Jacoco.

введите здесь описание изображения

Но когда я отлаживаю тестовый пример, он выполняет эти строки. Ниже приведены тестовые примеры, которые я написал.

@PrepareForTest({MessagingAdapterFactory.class, MessagingConfigReaderFactory.class,UpdaterServiceExecutor.class,Files.class})
    @Test
    public void should_shutDown_the_scheduledExecutor_and_close_the_messagingAdapter() throws Exception {
        PowerMockito.mockStatic(Files.class);
        PowerMockito.when(Files.exists(any())).thenReturn(true);

        PowerMockito.mockStatic(MessagingAdapterFactory.class);
        PowerMockito.when(MessagingAdapterFactory.getMessagingAdapter("edgeNode")).thenReturn(messagingAdapterMock);
        PowerMockito.mockStatic(MessagingConfigReaderFactory.class);
        PowerMockito.when(MessagingConfigReaderFactory.getConfigurationReader()).thenReturn(readerMock);

        ScheduledExecutorService scheduledExecutorServiceMock = Mockito.mock(ScheduledExecutorService.class);

        PowerMockito.mockStatic(Executors.class);
        PowerMockito.when(Executors.newSingleThreadScheduledExecutor()).thenReturn(scheduledExecutorServiceMock);

        when(readerMock.getConfigParams()).thenReturn("somePath,somePath,somePath");
        when(decompressUtilMock.decompressZip(Matchers.anyString(),Matchers.anyString())).thenReturn(true);
        when(checkSumUtilMock.check(anyString(), anyString())).thenReturn(true);
        when(commandExecutorMock.executeCommand("somePath verify /pa somePathKubeUpdates/KubePlatformSetup.exe")).thenReturn(false);
        updaterServiceExecutor.execute();
        Thread.sleep(10000);
        updaterServiceExecutor.close();

        verify(scheduledExecutorServiceMock,timeout(10000).times(1)).shutdownNow();
        verify(messagingAdapterMock,timeout(10000).times(1)).close();
    }

    @PrepareForTest({MessagingAdapterFactory.class, MessagingConfigReaderFactory.class,UpdaterServiceExecutor.class,Files.class})
    @Test
    public void should_not_throw_ServiceSDKException_when_occurred_while_closing_the_messagingAdapter() throws Exception {
        PowerMockito.mockStatic(Files.class);
        PowerMockito.when(Files.exists(any())).thenReturn(true);

        PowerMockito.mockStatic(MessagingAdapterFactory.class);
        PowerMockito.when(MessagingAdapterFactory.getMessagingAdapter("edgeNode")).thenReturn(messagingAdapterMock);
        PowerMockito.mockStatic(MessagingConfigReaderFactory.class);
        PowerMockito.when(MessagingConfigReaderFactory.getConfigurationReader()).thenReturn(readerMock);

        ScheduledExecutorService scheduledExecutorServiceMock = Mockito.mock(ScheduledExecutorService.class);

        PowerMockito.mockStatic(Executors.class);
        PowerMockito.when(Executors.newSingleThreadScheduledExecutor()).thenReturn(scheduledExecutorServiceMock);

        when(readerMock.getConfigParams()).thenReturn("somePath,somePath,somePath");
        when(decompressUtilMock.decompressZip(Matchers.anyString(),Matchers.anyString())).thenReturn(true);
        when(checkSumUtilMock.check(anyString(), anyString())).thenReturn(true);
        when(commandExecutorMock.executeCommand("somePath verify /pa somePathKubeUpdates/KubePlatformSetup.exe")).thenReturn(false);
        doThrow(new ServiceSDKException()).when(messagingAdapterMock).close();

        updaterServiceExecutor.execute();
        Thread.sleep(10000);
        updaterServiceExecutor.close();

        verify(scheduledExecutorServiceMock,timeout(10000).times(1)).shutdownNow();
        verify(messagingAdapterMock,timeout(10000).times(1)).close();
    }

Что здесь не так? Почему отображается Jacoco, поскольку строки не были выполнены? Пожалуйста посоветуй.


person AnOldSoul    schedule 03.05.2016    source источник


Ответы (2)


Jacoco и PowerMockito не работают вместе.

Jacoco обрабатывает байт-код, собирает данные о покрытии, а затем связывает информацию о покрытии с исходным кодом на основе некоторого идентификатора класса.

PowerMockito также обрабатывает байт-код, что приводит к различным идентификаторам классов, поэтому покрытие, рассчитанное Jacoco, не может быть связано с исходным кодом, поскольку информация об идентификаторе не совпадает.

Это известная проблема.

person Gerald Mücke    schedule 03.05.2016
comment
Но я получаю покрытие для других классов. Нет ли обходного пути для этого? - person AnOldSoul; 03.05.2016
comment
Для других классов вы, вероятно, не используете статические насмешки. Насмешка над экземплярами (стандартный способ Mockito) не затрагивается. - person Gerald Mücke; 03.05.2016

Ответы Джеральда - причина. Это происходит только в том случае, если вы поместили тестируемый класс внутрь @PrepareForTest. Поэтому я удалил это из некоторых методов, и теперь он работает нормально. Наличие самого PowerMockito не вызывает никаких проблем. Проблемы возникают, только если у вас есть имя класса в @PrepareForTest. Найдите способы управлять им, используя только имя класса статического метода, а не класса, для которого вы пишете тестовые примеры.

person AnOldSoul    schedule 04.05.2016