Невозможно имитировать удаленные вызовы с помощью powemockito для объекта InitialContext - PullRequest
0 голосов
/ 09 июля 2020

У меня есть частный метод, как показано ниже. Что я хочу протестировать с помощью powermockito, а также мне нужно показать покрытие для него. Для покрытия я использую jacoco .

МетодA содержит вызов поиска и пытается с ресурсом, который вызывает у меня проблемы с получением покрытия кода.

private void methodA() {
    InitialContext l1 = new InitialContext();
    DataSource ds = (DataSource) l1.lookup(systemQueryData.getDataSource());

    try (Connection con = ds.getConnection();
                PreparedStatement preparedStatement = con
                        .prepareStatement(getUnprocessedZsmartGlobalSelectQuery);) {
     // some code here ...
    }
}

Я использую powermockito для имитации приватного и статического c контента. Я создал макеты, как показано ниже.

initialContext = PowerMockito.mock(InitialContext.class);
datasourceMock = PowerMockito.mock(DataSource.class);
connectionMock = PowerMockito.mock(Connection.class);
preparedStatementMock = PowerMockito.mock(PreparedStatement.class);

Пожалуйста, найдите мой тестовый класс ниже.

//@RunWith(PowerMockRunner.class) // AS this annotation does not play well with jacoco code coverage 
I have commented it and taken another approach as suggested in many forums.
@PrepareForTest({ProcessZsmartInvoiceOperation.class, SQLQueryUtility.class, InitialContext.class, DataSource.class,Connection.class, PreparedStatement.class})
public class ProcessZsmartInvoiceOperationTest {

//another approach to enable powermockito
static { PowerMockAgent.initializeIfNeeded(); }

//another approach to enable powermockito     
@Rule
public PowerMockRule powerMockRule = new PowerMockRule();

private InitialContext initialContext = null; 
private DataSource datasourceMock = null;
private Connection connectionMock = null;
private PreparedStatement preparedStatementMock = null;

@Before
public void init() {
    try {
    
        initialContext = PowerMockito.mock(InitialContext.class);
        datasourceMock = PowerMockito.mock(DataSource.class);
        connectionMock = PowerMockito.mock(Connection.class);
        preparedStatementMock = PowerMockito.mock(PreparedStatement.class);

        processZsmartInvoiceOperationSpy = PowerMockito.spy(processZsmartInvoiceOperationInstance);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Test
public void getUnProcessedEntities_givenDateString_shouldReturnList() {

// START some basic static code to use for testing the method
    List<String> listOfUnProcessedInvoice = new ArrayList<>();
    listOfUnProcessedInvoice.add("101");
    listOfUnProcessedInvoice.add("102");
    String dateInput = "11-JUN-20";
// END some basic static code to use for testing the method

    try {
        PowerMockito.whenNew(InitialContext.class).withNoArguments().thenReturn(initialContext);
        // from below statment it does not coverage
        PowerMockito.doReturn(datasourceMock).when(initialContext.lookup(Mockito.anyString()));
        PowerMockito.doReturn(connectionMock).when(datasourceMock.getConnection());
        PowerMockito.doReturn(preparedStatementMock).when(connectionMock.prepareStatement(Mockito.anyString()));
        PowerMockito.doNothing().when(processZsmartInvoiceOperationSpy,"setParameter",preparedStatementMock,
                Mockito.any(List.class));
        
        List<String> testResponseList = (List<String>)Whitebox.invokeMethod(processZsmartInvoiceOperationSpy,
                "getUnProcessedEntities",dateInput);
        Assert.assertEquals(listOfUnProcessedInvoice.size(), testResponseList.size());
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

Когда я запускал этот тестовый пример, он не показывает покрытия. Пожалуйста, проверьте изображение ниже.

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

Пожалуйста, помогите, как имитировать этот метод и получить покрытие кода ..

...