我有以下代码行表示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为什么显示线条没有被执行?请指教。
答案 0 :(得分:3)
Jacoco和PowerMockito不能一起工作。
Jacoco检测字节代码,收集覆盖数据,然后根据类的某些标识符将覆盖信息与源代码相关联。
PowerMockito也会检测字节码,这会导致不同的类标识符,因此Jacoco计算的覆盖范围无法与源代码关联,因为标识符信息不匹配。
这是known issue。
答案 1 :(得分:2)
杰拉尔德的答案就是原因。只有在将要测试的类放在@PrepareForTest中时才会发生这种情况。所以我从某些方法中删除了它,现在它的工作正常。拥有PowerMockito本身并不会导致任何问题。只有在@PrepareForTest中有类名时才会出现问题。找到仅使用静态方法类的名称来管理它的方法,而不是用于编写测试用例的类。