JMockit, как мне издеваться над частным методом без возврата

Я пытаюсь издеваться над частным методом с помощью JMockit и борюсь. Я работал с учебными пособиями и могу имитировать частные методы, которые возвращают значения без нужды. Этот конкретный метод взаимодействует с базой данных и ничего не возвращает. Для целей этого теста все, что я хочу сделать, это эффективно замаскировать этот метод. Формат теста, который я использую, показан ниже, обратите внимание, что обычно результат будет сразу после вызова деинкапсуляции метода.

    @Test
public void testRetrieveAndSaveReport() {

    //Make class with private class final, to be used in the Exceptionsinners class
    final ESReportOutputLogic eSReportOutputLogic = new ESReportOutputLogic();

    //  Define Expectations
    //  pass eSReportOutputLogic as argument to make it a Mocked type in the Exceptions Class
    new Expectations(eSReportOutputLogic){
        ESReportOutputLogic eSReportOutputLogic;
        {
            Deepcapsulation.invoke(eSReportOutputLogic);

        }
    };

    ESReportOutputLogic rol = new ESReportOutputLogic();
    rol.retrieveAndSaveReport("","",1);

    //  asserts.....
}

person John Paul    schedule 05.12.2014    source источник
comment
Поскольку это частный метод, можете ли вы просто изменить подпись метода, чтобы вернуть какое-то значение. В этом случае, если операция с базой данных прошла успешно, верните 0, иначе верните 1. Трудно придумать какой-либо частный метод, который не передает результат своей деятельности вызывающему методу. Это может быть либо возвращаемое значение, либо выдача исключения.   -  person Gaurav    schedule 05.12.2014


Ответы (1)


Какую абстракцию вы используете для взаимодействия с базой данных?

Я бы рекомендовал издеваться над этим, а не пытаться издеваться над чем-то, что с точки зрения вашего теста не должно существуют.

Имитация частного метода означает, что вы фактически оставляете код в своем приложении незаметным для тестов.

person darrengorman    schedule 05.12.2014
comment
Спасибо за ваш ввод [rol.retrieveAndSaveReport (,, 1) взаимодействует с базой данных]. Мне это удалось, когда я впервые работал над этим, и теперь, когда я возвращаюсь к этому, я могу придумать лучшие способы решения моей проблемы. Самым простым было использование API Системных правил. У этого есть метод ExpectedSystemExit () и expectSystemExitWithStatus (int). Единственная загвоздка для тех, кто хочет использовать это, заключается в том, что им нужно будет получить правильную версию JUnit для использования с ним. - person John Paul; 23.10.2015