2

Ich habe die folgenden Codezeilen, die von Jacoco als nicht "ausgeführt" angezeigt werden.jacoco zeigt Zeilen als nicht abgedeckt, obwohl die Zeilen während der Ausführung des Codes ausgeführt werden

enter image description here

Aber wenn ich den Testfall debuggen tut es diese Zeilen ausführen. Unten sind die Testfälle, die ich geschrieben habe.

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

Was ist hier falsch? Warum wird Jacoco so angezeigt, wie die Zeilen nicht ausgeführt wurden? Bitte um Rat.

Antwort

1

Geralds Antworten sind der Grund. Dies tritt nur auf, wenn Sie die zu testende Klasse in @PrepareForTest abgelegt haben. Also entfernte ich das von bestimmten Methoden und jetzt funktioniert es gut. PowerMockito selbst verursacht keine Probleme. Probleme treten nur auf, wenn Sie den Klassennamen in @PrepareForTest haben. Suchen Sie nach Möglichkeiten, um nur den Namen der statischen Methodenklasse und nicht die Klasse, für die Sie die Testfälle schreiben, zu verwalten.

3

Jacoco und PowerMockito funktionieren nicht zusammen.

Jacoco instrumentiert den Byte-Code, sammelt die Coverage-Daten und ordnet anschließend die Coverage-Informationen basierend auf einem Bezeichner der Klasse dem Quellcode zu.

PowerMockito instrumentiert auch den Bytecode, dies führt zu unterschiedlichen Klassenbezeichnern, daher kann die von Jacoco berechnete Abdeckung nicht mit dem Quellcode verknüpft werden, da die Bezeichnerinformationen nicht übereinstimmen.

Dies ist ein known issue.

+0

Aber ich bekomme die Abdeckung für andere Klassen. Gibt es dafür keinen Workaround? – mayooran

+0

Für andere Klassen verwenden Sie wahrscheinlich kein statisches Mocking. Verspotten von Instanzen (der Standard Mockito Weg) ist nicht betroffen. –